планировщик задач неправильно выполняет пакетный файл

#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 него, входит в какой — то бесконечный цикл