#powershell #batch-file #taskscheduler
Вопрос:
когда я запускаю пакетный файл в планировщике задач Windows , он не выдает правильный вывод и показывает ошибку при копировании файлов 2 .bak, но если я запускаю его как файл оболочки питания, он выдает точный вывод и ошибки не возникает.этот код копирует папку резервной копии из рабочей папки и копирует ее на сервер резервного копирования. папка резервного копирования содержит 2 вложенные папки db и большие двоичные объекты .в папке db есть 3 файла .bak (это резервная копия репо nexus).Вот как я преобразовал его в пакетный файл
cd C:script powershell.exe -file C:codebackup_script.ps1
вот файл powershell
function CheckInDir { if (!(Test-Path $BackupDir)) { return $false Logging "Error" "$BackupDir does not exist" } if (!(Test-Path $Destination)) { return $false Logging "Error" "$Destination does not exist" } } filter Test-DirectoryEmpty($directory) { #[bool](Get-ChildItem $directory* -Force) [bool](Test-Path $directory) } Function Restore-Backup { Logging "INFO" "Started the Restoring Backup..." if(!(Test-DirectoryEmpty $BackupDir)){ Logging "Error" "$BackupDir is EMPTY!" return $false } $Folders = Get-ChildItem $BackupDir -Directory [hashtable]$DateTimeHashTable = [ordered]@{} $DatesValuesTable = @() foreach ($Folder in $Folders) { Logging "FOLDER" $Folder $FolderStringLen = ($Folder | measure-object -character | Select-Object -expandproperty characters) $FolderTimestamp = $Folder.Name.Substring(12, $FolderStringLen-12) Logging "FILE TIMESTAMP" $FolderTimestamp [datetime]$newFolderDateTime = [datetime]::ParseExact($FolderTimestamp, 'yyyy-MM-dd-HH-mm-ss', $null) Logging "DATE" $newFolderDateTime # Add blob-backup datetime and string into HashTable $DateTimeHashTable.Add($newFolderDateTime, $Folder) #Logging "HASHTABLE VALUES" $DateTimeHashTable.Values $SortedDTHT = $DateTimeHashTable.GetEnumerator() | Sort-Object Value -Descending $DatesValuesTable = $SortedDTHT | Select-Object -ExpandProperty Value } } Function CopyElementsInSingleBlobBackup($Folder){ # Going into single Blob-Backup folder, $BlobSubfolders = Get-ChildItem ${BackupDir}${Folder} -Directory foreach ($BlobSubfolder in $BlobSubfolders) { Logging "_FOLDER" $BlobSubfolder # if it is subfolder "db", then files are being copied to $data-dir/restore-from-backup if ($BlobSubfolder -match 'db') { $BlobSubFiles = Get-ChildItem ${BackupDir}${Folder}${BlobSubfolder} -Recurse Logging "_._FILES" $BlobSubFiles foreach ($File in $BlobSubFiles) { Logging "FILE ${File} is written FROM" "${BackupDir}${Folder}${BlobSubfolder}${File}" Logging "FILE ${File} is written TO" "${Destination}restore-from-backup${File}" Copy-Item "${BackupDir}${Folder}${BlobSubfolder}${File}" -Destination "${Destination}restore-from-backup${File}" } } else { # if folders are named "default" and "TEST", copy elements inside those folder to Destinationblobs subfolder Logging "FOLDER COPY FROM" "${BackupDir}${Folder}${BlobSubfolder}" Logging "FOLDER COPY TO" "${Destination}blobs" Copy-Item "${BackupDir}${Folder}${BlobSubfolder}" -Destination "${Destination}blobs" -Recurse } } } Function Remove-db_folders { $data = @('component','config','security') $data | ForEach-Object {Remove-db_folder($PSItem)} } Function Remove-db_folder { param ($FolderItem) $thisFolder = "${Destination}db${FolderItem}" if(Test-DirectoryEmpty $thisFolder){ Logging "INFO" "Removing folder ${thisFolder}" Remove-Item $thisFolder -Recurse } } Function CheckNexusServiceStatus($nexusServ) { $nexusServiceStatus = $nexusServ.Status Logging "INFO" "Nexus service status is ${nexusServiceStatus}" } $CheckDir=CheckInDir #returns true or false if ($CheckDir -eq $false) { Logging "ERROR" "One of the Directory are not available, Script has stopped" } else { Stop-Service -Name "nexus" $nexusService = Get-Service -Name 'nexus' CheckNexusServiceStatus($nexusService) if ($nexusService.Status -eq 'Stopped') { Remove-db_folders Restore-Backup
Если я запускаю его как power shell, он работает правильно, но при запуске в планировщике задач в виде пакетного файла он выдает ошибку
Get-childItem: cannot find path 'C:nexusblob-backupdbc:nexusblob-backupdb' because it does not exist. at C:script.ps1 146 char:5 Get-ChildItem "˘{BackupDir}${Folder}${BlobSubfolder}...." CategoryInfo : objectNotfound FullyQualifiedErrorId : PathNotFound,Microsoft.power.shell.commands.GetchildItem
может ли кто-нибудь помочь мне понять, почему эта ошибка возникает только в планировщике задач?
Комментарии:
1. Изменить
"${BackupDir}${Folder}${BlobSubfolder}"
на$BlobSubfolder.FullName
2. Ваш фильтр
Test-DirectoryEmpty
проверяет только наличие файла или папки. он НЕ проверяет, пуст он или нет.3. @MathiasR.Jessen, заменив его на
$BlobSubfolder.FullName
него, входит в какой — то бесконечный цикл