Скрипт PowerShell, запускаемый Планировщиком задач – код выхода не отражается в задаче

Вопрос или проблема

Я был бы рад, если кто-то мог бы мне помочь.

У меня есть скрипт PowerShell, который в случае ошибки (блок try-catch) завершает работу с кодом выхода, используя команду exit 1. Этот скрипт вызывается задачей в Планировщике заданий, который настроен для запуска powershell.exe с параметрами -File C:\folder\script.ps1. Также задача настроена так, что если задача завершается неудачно, она должна повторно пытаться запустить её еще 5 раз.

Проблема, с которой я сталкиваюсь, в том, что даже если мой скрипт завершается с кодом ошибки, и я вижу в интерфейсе, что ‘статус последнего запуска’ равен 0x1, задача все равно считает, что она выполнилась успешно, и не пытается снова запустить скрипт.

Я пытался что-то погуглить, а также пробовал много разных советов, найденных в интернете, но ничего не помогло мне.
Если у вас есть какие-либо идеи, я буду признателен за любые подсказки.

Ответ или решение

Ваша проблема связана с тем, как Task Scheduler (Планировщик задач) интерпретирует коды завершения, возвращаемые вашими PowerShell-скриптами. По умолчанию, Task Scheduler не всегда обрабатывает коды завершения, если вы используете powershell.exe напрямую для запуска скрипта. Когда вы вызываете powershell.exe -File C:\folder\script.ps1, Task Scheduler может не правильно обрабатывать код выхода, что и приводит к тому, что он считает выполнение успешным.

Вот несколько шагов и рекомендаций, которые помогут вам правильно настроить выполнение и отслеживание ошибок вашего сценария:

1. Измените способ запуска PowerShell-скрипта

Попробуйте использовать параметр -NoProfile и обернуть выполнение скрипта в powershell.exe в команду, которая явно передает код завершения:

  1. Откройте Task Scheduler и найдите вашу задачу.
  2. Перейдите к свойству задачи и на вкладку "Действия" измените действие на следующее:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\folder\script.ps1"

2. Оберните ваш скрипт в блок

Если все еще возникают проблемы, попробуйте использовать следующий подход:

  1. Создайте вспомогательный .bat файл (например, run_script.bat), который будет запускать ваш PowerShell-скрипт:
@echo off
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\folder\script.ps1"
exit /b %ERRORLEVEL%
  1. Затем измените действие в Task Scheduler на вызов этого .bat файла:
C:\path\to\run_script.bat

3. Убедитесь, что код завершения корректно установлен

В вашем PowerShell-скрипте убедитесь, что коды завершения правильно возвращаются в блоке catch. Например:

try {
    # ваш код здесь
} catch {
    Write-Host "Произошла ошибка: $_"
    exit 1
}

4. Проверьте настройки задачи

Проверьте настройки задачи в Task Scheduler:

  • Убедитесь, что настройка "Требуется, чтобы компьютер был включен" активирована, если задача должна выполняться даже при отсутствии пользователя.
  • Убедитесь, что вы проверили опцию "При неудачном выполнении выполнить еще раз через…" и установили необходимое количество попыток.

5. Проверьте журналы событий

Если проблема остается, используйте журнал событий Windows, чтобы выяснить, что происходит на самом деле. В журнале событий вы можете найти дополнительные детали об ошибках выполнения задач.

Выполнив эти шаги, вы сможете лучше контролировать выполнение вашего PowerShell-скрипта и правильно обрабатывать коды завершения в Task Scheduler.

Оцените материал
Добавить комментарий

Капча загружается...