Часть 1 заключается в том, чтобы PowerShell возвращал корректный код последнего выхода планировщику задач.
Это одна из особенностей планировщика задач.Он просто сообщает, что, да, PowerShell.exe
успешно запущен.Проблема в том, что PowerShell.exe
не сообщает код завершения, потому что, да, PowerShell.exe
работал правильно, даже если сценарий не выполнялся.
Я смог обойти это.переключиться с запуска сценария с параметром -File
, который не возвращает значение выхода, на параметр -Command
.Таким образом, я могу выйти из PowerShell.exe
с правильным кодом выхода, явно выйдя со значением $LASTEXITCODE
:
#Run Scheduled task with the following command
powershell.exe -Command ". C:\Scripts\RunScript.ps1; exit $LASTEXITCODE"
Так что в вашем случае это будет:
powershell.exe -ExecutionPolicy Bypass -Command ". C:\Users\me\Documents\powershell\disasterBackup.ps1; exit $LASTEXITCODE"
-- Редактировать ----
Часть 2 - запуск запланированной задачи при событии, когда не удается отправить сообщение электронной почты или что-то в этом роде.
Проблема с планировщиком задач - то же самоеу нас было с выходом PowerShell.Независимо от того, какой код завершения возвращен, задача всегда регистрирует событие с кодом 201 - Действие завершено ... что является правильным ... независимо от того, что задание завершено, даже если задание, которое было выполнено внутренне, не удалось.
Глядя дальше в подробности зарегистрированного события, мы видим, что ResultCode
в EventData
действительно настроен правильно.Так что это простая задача отфильтровать это через графический интерфейс, верно? .... ну нет ... За EventID нет фильтра.Теперь нам нужно написать собственный фильтр событий для включения на основе ResultCode
.Нам нужен XML-запрос XPath:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">
*[System[(Level=4 or Level=0) and (EventID=201)]]
and
*[EventData[Data[@Name='ResultCode'] and (Data='2147942401')]]</Select>
</Query>
</QueryList>
Итак, чтобы разбить его, мы хотим:
Event log: Microsoft-Windows-TaskScheduler/Operational
Event Level: 4 or 0 = Information
Event ID: 201
And
Event Data: ResultCode = 2147942401
Если мы установили неверный код выхода равным 1, почему ResultCode = 2147942401
?потому что он на самом деле возвращает 0x1
, который является шестнадцатеричным 0x80070001
, что равно десятичному числу 2147942401
.Так что вам нужно будет посмотреть детали события, чтобы найти «правильный» ResultCode.