Error {1} <<<<

В последнее время что то часто стали возникать вопросы по работе с ошибками в PowerShell. В частности поднимали тему на вчерашнем Live Meeting у Паши Нагаева, где я и сделал кратенькую демонстрацию. (Кстати не пропустите онлайн-встречу в следующую среду — обещаны демки «взлома» контроллера AD😉 )

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

Итак, для начала вспомним методы командных файлов bat и cmd. Там существовала переменная %ERRORLEVEL% в которую помещался код возвращаемый последней выполненной программой. В случае если программа отработала нормально, то в переменную помещался 0, а любое другое значение означало что при выполнении произошла какая то ошибка.

В PowerShell тоже можно получить доступ к этому значению, воспользовавшись переменной $LastExitCode. Но конечно следует помнить что это значение возвращается обычно только внешними утилитами командной строки (и то не всеми к сожалению), и иногда скриптами PowerShell, если выход из скрипта осуществляется с помощью команды Exit (которой в качестве аргумента как раз можно указать этот exit code). Но тем не менее переменная всё же остаётся полезной, и весьма часто.

PS> ping.exe ya.ru -n 1 | out-null; if ($LASTEXITCODE -eq 0) {"Хост отвечает"} else {"Ошибка"}
Хост отвечает
PS> ping.exe nonexistant.host -n 1 | out-null; if ($LASTEXITCODE -eq 0) {"Хост отвечает"} else {"Ошибка"}
Ошибка

В случае если вы работаете с командами PowerShell, гораздо более полезной будет переменная $? (знак вопроса). Это boolean переменная, которая сообщает нам успешно ли выполнилась последняя команда ($True) или при выполнении произошли ошибки ($False).

PS> Get-Process explorer

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    713      32    36244      37892   268    33,26   3684 explorer

PS> $?
True
PS> Get-Process nonexistantProcess
Get-Process : Cannot find a process with the name 'nonexistantProcess'. Verify the process name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<<  nonexistantProcess
PS> $?
False

Учтите, $? относится именно к успешности последней команды PowerShell, и вовсе не заменяет $LastExitCode. Если посмотреть её значение после выполнения например ping.exe nonexistant.host -n 1 то оно будет равно $True, ведь с точки зрения PowerShell, команда была выполнена успешно — ping.exe запустился. А уж что за проблемы у него возникли, волнует только переменную $LastExitCode😉

Опубликовано в Learn, PowerShell, Scripting. 1 Comment »

Один ответ to “Error {1} <<<<”

  1. Про ошибки « PowerShell и другие скрипты Says:

    […] свои посты про ошибки, а то тяжко ссылки давать на все Error {1} <<<< -ErrorAction -ErrorVariable $Error Trap Не все $Errors одинаково критичны […]


Обсуждение закрыто.

%d такие блоггеры, как: