Как получить планировщик задач для обнаружения сбой кода ошибки из сценария powershell - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть несколько сценариев PowerShell, которые я пытаюсь вызвать как сбойное состояние в планировщике задач Windows, когда в них есть сбои.Так что я делаю что-то подобное в скрипте powershell.Я пробовал код выхода 1 или 99, и не похоже, что планировщик задач Windows видит это как состояние сбоя.Таким образом, мое электронное письмо с кодом ошибки не отправляется, чтобы уведомить меня.

Как я могу получить планировщик задач, чтобы увидеть, что мой скрипт powershell имел ошибку?Он всегда имеет коды событий 129 (созданная задача), 100 (задача запущена), 200 (действие запущено), 110 (задача запущена), 201 (действие выполнено), 102 (задача выполнена).

$global:ErrorStrings = New-Object System.Collections.Generic.List[System.Object] #I add strings onto the list as I find errors

$errorCodeAsString = ""
foreach ($item in $global:ErrorStrings.Members){
   $errorCodeAsString += (" " + $item + "..")
}
if($errorCodeAsString -ne "")
{
   write-output  "Error: $errorCodeAsString"
   Exit 99 #Exit 1 didn't cause task scheduler to see error at exit either
}
Exit 0

Я знаю, что мой список заполнен ошибками, потому что я создал их, чтобы проверить его.Я проверил, что errorCode как строка имеет длину, и нажал на выходе 99 или 1. Планировщик задач все еще показывает нормальные коды событий.

У меня запланировано оповещение по электронной почте о сбое, и, поскольку коды событий не показывают сбоев, он никогда не будет вызывать отправку моей электронной почты.Это windows 10, на случай, если это имеет значение.

Я смотрел на ошибки powershell sql , Ошибка успеха планировщика задач , Подсказки хитрости запланированные задачи, код выхода powershell , но это не помогает.

Сценарии powershell настраиваются в планировщике задач следующим образом:

action: запустить программу

программа / скрипт: PowerShell

Добавить аргументы: -ExecutionPolicy Bypass -File C: \ Users \ me \ Documents \PowerShell \ disasterBackup.ps1

Ответы [ 2 ]

0 голосов
/ 03 августа 2019

Что бы я сделал, это прикрепил запланированное задание к неудачному событию, чтобы в этом случае вызвать запланированное задание.

0 голосов
/ 21 декабря 2018

Часть 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...