Невозможно переместить файл после долгого выполнения задачи - PullRequest
1 голос
/ 23 апреля 2019

У меня есть сценарий Windows PowerShell, выполняемый планировщиком задач Windows. Код powershell запускает исполняемую программу cli (java), которая создает собственный лог-файл, затем, когда мой сценарий powershell завершает работу, пытается переименовать файл и затем загрузить его на удаленный сервер. Тем не менее, я обнаружил, что он успешно загружает файл только при 3-м или 4-м выполнении и не уверен почему. История в планировщике задач не содержит подробностей относительно того, что могло произойти (блокировка файла?). Любые идеи о том, как я могу решить это? Вот основной пример того, что я делаю:

$old_log_name = "old_logfilename"
$new_log_name = "new_logfilename"
C:\path\to\my-java-program.exe -pass -some -options
Move-Item -Path $old_log_name -Destination $new_log_name
gsutil cp $new_log_name gs://cool-bucket-with-cf

Я уверен, что проблема в переименовании файла, а не в его загрузке, потому что это можно увидеть в проводнике Windows. Должен ли я проверить, доступен ли файл для переименования или нет?

Редактировать (пересмотренный код основан на комментариях ниже):

$app_version = "4.5.7"
$now = get-date
$now = $now.ToString("yyyyMMddhhmm")
$old_log_name = "D:\myapp_$app_version.log"
$new_log_name = "D:\myapp_servername_$app_version.$now.log"
$arguments = "-a -c C:\myapp\config\Stage-$app_version.xml"
Start-Process C:\myapp\bin\4.5.7\myapp.exe -ArgumentList $arguments -NoNewWindow -Wait
Move-Item -Path $old_log_name -Destination $new_log_name
gsutil cp $new_log_name gs://path-to-mybucket

1 Ответ

1 голос
/ 23 апреля 2019

Почему бы вам не запустить процесс с помощью Java-программы, поэтому он ожидает его завершения?

$old_log_name = "old_logfilename"
$new_log_name = "new_logfilename"
Start-Process C:\path\to\my-java-program.exe -ArgumentList "your options" -NoNewWindow -Wait
Move-Item -Path $old_log_name -Destination $new_log_name
gsutil cp $new_log_name gs://cool-bucket-with-cf

Обновление
Поскольку это запланированная задача,вам нужно добавить новый журнал событий, чтобы регистрировать события из вашего скрипта (для этого вам нужны права администратора):

New-EventLog -LogName Application -Source TheScriptThatCallsMyJavaProgram

Затем замените вызов Start-Process на следующий (EventId является случайнымздесь):

Write-EventLog -LogName Application -Source TheScriptThatCallsMyJavaProgram -EventId 3001 -Message "my-java-program.exe is about to start" # This logs the start of the program
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "C:\path\to\my-java-program.exe"
$pinfo.Arguments = "your options"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
Write-EventLog -LogName Application -Source TheScriptThatCallsMyJavaProgram -EventId 3002 -Message "my-java-program.exe is exited" # This logs the end of the program
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...