Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Возврат кода ошибки из Powershell скрипта в Task Scheduler (http://forum.oszone.net/showthread.php?t=339030)

mycatshoegazer 02-02-2019 15:39 2855902

Возврат кода ошибки из Powershell скрипта в Task Scheduler
 
Добрового времени суток, господа автоматизирующие.
Есть у меня 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'


Kazun 02-02-2019 16:27 2855913

Для начала проверить, что запускается скрипт и корректно завершается:

Код:

$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 2855914

Цитата:

Цитата Kazun
Для начала проверить, что запускается скрипт и корректно завершается »

Скрипт работает и завершается корректно, так как я проверял его работу в PoserShell ISE.

Kazun 02-02-2019 16:34 2855915

Цитата:

Цитата mycatshoegazer
Конфигурация
Профиль | Отправить PM | Цитировать | Сообщить модератору
Цитата Kazun:
Для начала проверить, что запускается скрипт и корректно завершается »
Скрипт работает и завершается корректно, так как я проверял его работу в PoserShell ISE. »

Причем тут PowerShell ISE? Скрипт запускается через Task Scheduler и в PowerShell.exe , поэтому надо проверять именно там.

mycatshoegazer 02-02-2019 17:01 2855925

Вложений: 1
Цитата:

Цитата Kazun
Скрипт запускается через Task Scheduler и в PowerShell.exe , поэтому надо проверять именно там. »

Так, я проверил работу через Task Scheduler. Задача так и висит в статусе "Работает", папка Temp с содержимым run.txt не появилась. Во вложении я оставил настройки запуска задачи.

Kazun 02-02-2019 17:10 2855929

Значит запуск скрипта не происходит, проверять аргументы для задачи:
Код:

-NoProfile -ExecutionPolicy ByPass -File C:\Scripts\script.ps1

mycatshoegazer 02-02-2019 17:47 2855937

Цитата:

Цитата Kazun
Значит запуск скрипта не происходит, проверять аргументы для задачи »

Запустил скрипт дополнительно с параметром -NoProfile в планировщике. Теперь папка и файл корректно создаются, но статус задачи висит "Работает".

Kazun 02-02-2019 17:49 2855939

Цитата:

Цитата mycatshoegazer
Запустил скрипт дополнительно с параметром -NoProfile в планировщике. Теперь папка и файл корректно создаются, но статус задачи висит "Работает". »

F5 пробовали нажимать для обновления статуса задачи?

mycatshoegazer 02-02-2019 18:02 2855944

Цитата:

Цитата Kazun
F5 пробовали нажимать для обновления статуса задачи? »

Да, действительно статус возвращается в нормальное состояние. Большое спасибо за помощь!

Ещё вопрос имеется. А как всё таки возвращать из скрипта коды ошибки чтобы их потом можно было мониторить? Для классических приложений, к примеру, в Си-подобных языках и вообще приложениях уровня системы мы просто возвращаем код ошибки из главной функции.

Kazun 03-02-2019 17:39 2856063

Exit $LASTEXITCODE или задать свой код ошибки

Serguei Kouzmine 04-02-2019 09:06 2856137

@kazun подскажите как правильно делать в
EventLog

- на русском к сожалению пока не нашел
https://docs.microsoft.com/en-us/dot...ramework-4.7.2
https://social.technet.microsoft.com...m=winservergen

Kazun 04-02-2019 09:11 2856138

Цитата:

Цитата Serguei Kouzmine
@kazun подскажите как правильно делать в
EventLog
- на русском к сожалению пока не нашел
https://docs.microsoft.com/en-us/dot...ramework-4.7.2
https://social.technet.microsoft.com...m=winservergen »

Есть встроенный командлет Write-EventLog, но может потребоваться делегировать на запись в определенный журнал, что усложнит задачу, проще использовать txt лог файл.

mycatshoegazer 04-02-2019 15:21 2856180

Цитата:

Цитата Kazun
Exit $LASTEXITCODE или задать свой код ошибки »

Благодарю


Время: 14:36.

Время: 14:36.
© OSzone.net 2001-