Запланированное задание для robocopy Сценарий PowerShell не завершается - что не так? - PullRequest
0 голосов
/ 16 января 2019

Я работаю над сценарием PowerShell для автоматического перемещения некоторых файлов на удаленный сервер каждые 5 минут.

Журналы всегда вложены в две директории. Меня не волнуют эти каталоги. И папки, и файлы могут иметь, но не всегда, случайные имена. Я использовал локальный временный каталог, чтобы выполнить вложение перед переносом файлов на robocopy.

Я также создал новый источник журнала событий для устранения неполадок. Я срежу их после того, как смогу заставить это работать. Я считаю, что я запускаю это из планировщика задач правильно (как запустить программу C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe с аргументами -WindowStyle Hidden -File "C:\PathToScript\ThisIsTheScript.ps1").

Вот как это должно происходить при автоматизации.

  1. Запускается планировщиком задач
  2. При необходимости создайте каталог временных журналов
  3. Удаление и перемещение журналов в каталог временных журналов
  4. Удалить все пустые каталоги из источника
  5. robocopy к целевому ресурсу по имени UNC
  6. Планировщик заданий завершает задачу

Файлы остаются в каталоге временного журнала, не копируются на конечный сервер, и планировщик задач никогда не завершает работу - он продолжает работать. Однако все записи журнала устранения неполадок создаются, даже если в строке robocopy используются Start-Job и Wait-Job.

Шаги 5 и 6 не выполняются по расписанию, только при запуске вручную. Почему файлы не копируются и почему не выполняется задача при запуске в планировщике задач?

# Source Variables
$LogSource  = 'C:\Somewhat\Deeper\Directory\Log\Files\Dropped\Here'
$TempLogDir = 'C:\SomeFilesBrieflyHere'

# Destination variables
$DestHost   = 'thisisthedestinationcomputername'
$DestShare  = 'thisisthedestinationsharename$'

# Operating Variables
$Switches   = @("/s", "/MOVE", "/zb", "/R:0", "/W:0", "/MT:8", "/NFL", "/NDL", "/NP", "/IS", "/IT")
$RoboDo     = @("$TempLogDir","\\$DestHost\$DestShare","$Switches")

# Verify event log source exists and create it if it does not
if (-not ([System.Diagnostics.EventLog]::SourceExists("PowerShell Script"))) {
    New-EventLog -LogName 'Application' -Source 'PowerShell Script'
    Write-EventLog -LogName 'Application' -Source 'Powershell Script' -EventID 1 -EntryType Information -Message 'Created new Event Log: Application Source type: PowerShell Script'
}

# Write log for init
Write-EventLog -LogName 'Application' -Source 'Powershell Script' -EventID 1 -EntryType Information -Message 'The scheduled task to move logs to the log server has been triggered and will now execute.'

# Verify Local LogDir exists
if (!(Test-Path -Path $TempLogDir)) {
    New-Item -ItemType directory -Path $TempLogDir
} 

# De-nest logs to local log folder in preparation to move
Get-ChildItem -Path "$LogSource" | Get-ChildItem | Get-ChildItem | Move-Item -Destination "$TempLogDir" -Force
Write-EventLog -LogName 'Application' -Source 'Powershell Script' -EventID 1 -EntryType Information -Message "Files locally de-nested into $TempLogDir."

# Remove all empty directories with unicorn glitter
Get-ChildItem $LogSource -Recurse | Where {$_.PSIsContainer -and @(Get-ChildItem -LiteralPath:$_.FullName).Count -eq 0} | Remove-Item -Confirm:$false -Force
Get-ChildItem $TempLogDir -Recurse | Where {$_.PSIsContainer -and @(Get-ChildItem -LiteralPath:$_.FullName).Count -eq 0} | Remove-Item -Confirm:$false -Force
Write-EventLog -LogName 'Application' -Source 'Powershell Script' -EventID 1 -EntryType Information -Mes

# Begin Robocopy operation
robocopy $TempLogDir \\$DestHost\$DestShare $Switches
Write-EventLog -LogName 'Application' -Source 'Powershell Script' -EventID 1 -EntryType Information -Message "The scheduled task to move logs to the log server has been completed and the files were successfully copied to $DestHost."

1 Ответ

0 голосов
/ 17 января 2019

Попробуйте вместо этого изменить строку robocopy: & robocopy $TempLogDir \\$DestHost\$DestShare $Switches Проблема может заключаться в том, что ваш сценарий останавливается на этой строке, жалуясь на то, что robocopy не является командлетом или функцией, даже если он работает при запуске вручную.

...