2009-06-19 2 views
7

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

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

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

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

ответ

9

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

В V1 вы можете использовать ключевое слово trap. Существует pretty good, concise article, который описывает ключевые различия между ловушками и синтаксисом try/catch/finally, который был добавлен в V2.

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

trap {"Other terminating error trapped" } 
trap [System.Management.Automation.CommandNotFoundException] 
     {"Command error trapped"} 
1/$null 
+0

То, что мне было нужно, спасибо огромное! – scobi

+0

Имя глобальной переменной: $ ErrorActionPreference, а не $ errorpreference: http://blogs.msdn.com/powershell/archive/2008/04/10/erroraction-update.aspx –

0

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

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

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

Get-Help about_Errors 
Get-Help about_Trap 
+0

Так, может быть, он был удален в V2CTP3, но там нет about_errors или about_trap. И ваш ответ вроде суммируется с вопросом, из которого возник мой вопрос. Posh - .NET-y, я знаю о try-catch и т. Д., Но на самом деле это не помогает ответить на любой из моих вопросов. – scobi

Смежные вопросы