Как правильно обрабатывать ошибки в PowerShell? - PullRequest
7 голосов
/ 19 июня 2009

PowerShell - это странное сочетание .bat и .NET. В .bat вы проверяете выходные данные errorlevel и stderr из команд. В .NET вы ловите исключения.

Как командлеты возвращают ошибки? Они выдают исключения, когда терпят неудачу, или они устанавливают $? вместо? Это настраивается?

Я также предполагаю, что функции .NET, которые я вызываю в PowerShell, всегда будут генерировать исключения и не будут автоматически перехватываться оболочкой и преобразовываться в ошибки. Это правильно?

Может быть, я действительно должен спросить: какая хорошая статья рассказывает обо всем этом? Кажется, что многие инженеры, такие как я, имеющие опыт работы с cmd .bat и .NET, задаются вопросом, как именно нам следует поступать в этом смелом новом мире Posh.

Ответы [ 2 ]

9 голосов
/ 20 июня 2009

Для отдельных командлетов есть параметр, называемый -erroraction. Возможные значения: SilentlyContinue, Stop, Continue или Inquire. Вы также можете указать глобальную переменную $ errorpreference для любой из этих опций.

В V1 вы можете использовать ключевое слово trap. Есть довольно хорошая, краткая статья , которая описывает ключевые различия между ловушками и синтаксисом try / catch / finally, которые были добавлены в V2.

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

trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] 
      {"Command error trapped"}
1/$null
0 голосов
/ 19 июня 2009

Я считаю Posh всем .Net. Большинство концепций, которые работают в .Net, должны работать в Posh.

Для обработки ошибок вы можете использовать Try..catch. Также возможно «перехватить» ошибки и указать свой собственный набор инструкций для выполнения при условии ошибки.

Я очень рекомендую встроенную помощь:

Get-Help about_Errors
Get-Help about_Trap
...