Показать полную графическую версию : [решено] Возврат кода ошибки из Powershell скрипта в Task Scheduler
mycatshoegazer
02-02-2019, 15:39
Добрового времени суток, господа автоматизирующие.
Есть у меня PowerShell скрипты, автоматизирующие некоторые действия в моей системе (Windows 10) посредством запуска из планировщика заданий (Task Scheduler) по расписанию и по некоторым триггерам. Проблема состоит в том, что после каждого их выполнения задача висит со статусом "Работает" даже, если скрипт свои задачи выполнил. Вопрос в том, как вернуть код ошибки из скрипта, если он вызывается планировщиком заданий.
К примеру, эффекта не даёт ни return, ни exit.
return 0; // или 0x0
// или
exit 0; // или 0x0
Ниже представлен один из моих скриптов. Конкретно этот перезагружает видео драйвер Intel HD Graphics после разблокировки экрана.
Add-Type -AssemblyName System.Threading
$intelVideoDriver = Get-PnpDevice | where { $_.Name -like "Intel(R) HD Graphics 4000" }
Disable-PnpDevice $intelVideoDriver.DeviceID -Confirm:$false
[System.Threading.Thread]::Sleep(2000)
Enable-PnpDevice $intelVideoDriver.DeviceID -Confirm:$false
New-BurntToastNotification -Text "System maintenanace", 'Intel HD 4000 reloaded'
Для начала проверить, что запускается скрипт и корректно завершается:
$null = New-Item C:\Temp -Type Directory
Get-Date > C:\Temp\run.txt
PS. Запускать с параметрами:
PowerShell.exe -ExecutionPolicy ByPass -File C:\Scripts\script.ps1
Или добавить логгирование в свой скрипт, на каком этапе останавливается:
$log = "C:\test\log.txt"
"Start" >>$log
Add-Type -AssemblyName System.Threading
$intelVideoDriver = Get-PnpDevice | where { $_.Name -like "Intel(R) HD Graphics 4000" }
Disable-PnpDevice $intelVideoDriver.DeviceID -Confirm:$false
"Disable" >>$log
[System.Threading.Thread]::Sleep(2000)
"Sleep" >>$log
Enable-PnpDevice $intelVideoDriver.DeviceID -Confirm:$false
"Enable" >>$log
New-BurntToastNotification -Text "System maintenanace", 'Intel HD 4000 reloaded'
"Message" >>$log
mycatshoegazer
02-02-2019, 16:30
Для начала проверить, что запускается скрипт и корректно завершается »
Скрипт работает и завершается корректно, так как я проверял его работу в PoserShell ISE.
Конфигурация
Профиль | Отправить PM | Цитировать | Сообщить модератору
Цитата Kazun:
Для начала проверить, что запускается скрипт и корректно завершается »
Скрипт работает и завершается корректно, так как я проверял его работу в PoserShell ISE. »
Причем тут PowerShell ISE? Скрипт запускается через Task Scheduler и в PowerShell.exe , поэтому надо проверять именно там.
mycatshoegazer
02-02-2019, 17:01
Скрипт запускается через Task Scheduler и в PowerShell.exe , поэтому надо проверять именно там. »
Так, я проверил работу через Task Scheduler. Задача так и висит в статусе "Работает", папка Temp с содержимым run.txt не появилась. Во вложении я оставил настройки запуска задачи.
Значит запуск скрипта не происходит, проверять аргументы для задачи:
-NoProfile -ExecutionPolicy ByPass -File C:\Scripts\script.ps1
mycatshoegazer
02-02-2019, 17:47
Значит запуск скрипта не происходит, проверять аргументы для задачи »
Запустил скрипт дополнительно с параметром -NoProfile в планировщике. Теперь папка и файл корректно создаются, но статус задачи висит "Работает".
Запустил скрипт дополнительно с параметром -NoProfile в планировщике. Теперь папка и файл корректно создаются, но статус задачи висит "Работает". »
F5 пробовали нажимать для обновления статуса задачи?
mycatshoegazer
02-02-2019, 18:02
F5 пробовали нажимать для обновления статуса задачи? »
Да, действительно статус возвращается в нормальное состояние. Большое спасибо за помощь!
Ещё вопрос имеется. А как всё таки возвращать из скрипта коды ошибки чтобы их потом можно было мониторить? Для классических приложений, к примеру, в Си-подобных языках и вообще приложениях уровня системы мы просто возвращаем код ошибки из главной функции.
Exit $LASTEXITCODE или задать свой код ошибки
Serguei Kouzmine
04-02-2019, 09:06
@kazun подскажите как правильно делать в
EventLog
- на русском к сожалению пока не нашел
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventlog.writeentry?view=netframework-4.7.2
https://social.technet.microsoft.com/Forums/lync/en-US/789c963f-d61d-42c6-9e2d-a8b7a3062dd6/w2k8-task-scheduler-logs?forum=winservergen
@kazun подскажите как правильно делать в
EventLog
- на русском к сожалению пока не нашел
https://docs.microsoft.com/en-us/dot...ramework-4.7.2
https://social.technet.microsoft.com...m=winservergen »
Есть встроенный командлет Write-EventLog (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/write-eventlog?view=powershell-5.1), но может потребоваться делегировать на запись в определенный журнал, что усложнит задачу, проще использовать txt лог файл.
mycatshoegazer
04-02-2019, 15:21
Exit $LASTEXITCODE или задать свой код ошибки »
Благодарю
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.