Я запускаю задачу планировщика задач Windows:
Powershell
-command C:\file.ps1 2>&1 > c:\test.log
file.ps1
содержит
Try{
echo "a"
sleep 5
echo "b"
}
Finally{
echo "c"
}
Когда я запускаю задачу вручную и ожидаю ее завершения, test.log содержит «abc». Но когда я прерываю его, вручную выходя из него (кнопка «End»), он содержит только «a».
я думал Finally
предназначен даже для запуска при выходе из сценария powershell? Мой ожидаемый результат был "AC"
Ответы:
Как упоминается в комментариях Lieven Keersmaekers, блок finally не получает шансов на запуск, когда вы используете End для прерывания задачи. Это потому, что Конец просто убивает процесс. PowerShell с удовольствием запустил бы блок finally, прежде чем выполнять другие важные действия, но PowerShell вообще ничего не может сделать после сигнала завершения процесса - он мертв. Ни один процесс не может справиться с этим. в слова Рэймонда Чена :
Однако есть обходной путь. Поскольку команда End в планировщике заданий не уничтожает подпроцессы процесса задания, ваш основной скрипт PowerShell может запустить сторожевой процесс для выполнения окончательной очистки. Этот сценарий может выглядеть примерно так (назовем его
watchdog.ps1
):Он принимает идентификатор процесса, ожидает, пока этот процесс завершится, и только после этого выполняет некоторую очистку, эквивалентную вашему блоку finally.
Тогда ваш основной скрипт может выглядеть так:
Сначала он запускает сторожевой скрипт, предоставляя свой собственный идентификатор процесса. Затем он идет своим обычным делом, выходя нормально, как только это будет сделано.
Если вы хотите, чтобы очистка сторожевого таймера произошла только если основной скрипт прерывается, добавьте эту строку в конец основного скрипта:
Это предотвратит выход сторожа за пределы второй линии.
Ваше перенаправление будет применяться только к основному процессу, поэтому сторожевой таймер должен обрабатывать свое собственное направление вывода. В зависимости от конфигурации вашей запланированной задачи вам может понадобиться указать полный путь к сценарию watchdog в команде watchdog-launching основного сценария.
источник