Powershell: как я могу остановить отображение ошибок в сценарии?
когда мой сценарий PowerShell пытается, например, создать объект SQL Server для несуществующего сервера ("bla" в моем случае), PowerShell отображает множество ошибок PowerShell красным цветом.
Так как мой скрипт проверяет значение $? после таких вызовов и отображений и ошибок журналов я бы предпочел не отображать несколько строк ошибок PowerShell.
Как я могу отключить те, которые отображаются для моего скрипта?
5 ответов:
у вас есть несколько вариантов. Самый простой включает в себя использование
ErrorActionнастройки.
-Erroractionявляется универсальным параметром для всех командлетов. Если есть специальные команды, которые вы хотите игнорировать вы можете использовать-erroraction 'silentlycontinue'что будет в основном игнорировать все сообщения об ошибках, генерируемые этой команды. Вы также можете использоватьIgnoreзначение (в PowerShell 3+):в отличие от SilentlyContinue, Ignore не добавляет сообщение об ошибке в $Error automatic переменная.
если вы хотите игнорировать все ошибки в скрипте, можно использовать системную переменную
$ErrorActionи сделать то же самое:$ErrorActionPreference= 'silentlycontinue'посмотреть общие параметры для получения дополнительной информации.
Windows PowerShell предоставляет два механизма для сообщения об ошибках: один механизм для неустранимых ошибок и еще один механизм непрерывающие ошибки.
внутренний код командлетов может вызвать a
ThrowTerminatingErrorметод при возникновении ошибки, которая не позволяет или не должна позволять командлету продолжать обработку входных объектов. Сценарист может использовать исключение, чтобы поймать эти ошибки.EX:
try { Your database code } catch { Error reporting/logging }Внутренние Командлеты код можно назвать
WriteErrorметод для сообщения о неполадках, когда командлет может продолжить обработку входных объектов. Затем автор сценария может использовать параметр-ErrorAction для скрытия сообщений или использовать$ErrorActionPreferenceдля настройки всего поведения скрипта.
у меня была аналогичная проблема при попытке разрешить имя хоста, используя
[system.net.dns]. Если IP-адрес не был разрешен, .Net выдал завершающую ошибку. Чтобы предотвратить ошибку завершения и сохранить контроль над выводом, я создал функцию с помощьюTRAP.Например
Function Get-IP {PARAM ([string]$HostName="") PROCESS {TRAP {"" ;continue} [system.net.dns]::gethostaddresses($HostName) } }
Вы делаете это неправильно.
у вас уже есть хорошее, большое сообщение об ошибке. Зачем вам писать код, который проверяет
$?явно после каждая команда? Это чрезвычайно громоздко и подвержено ошибкам. Правильное решение -прекратить проверку$?.вместо этого используйте встроенный механизм PowerShell, чтобы взорвать для вас. Вы включаете его, установив предпочтения ошибки в самом высоком уровень:
$ErrorActionPreference = 'Stop'я поставил это в верхней части каждого сценария, который я когда-либо писал, и теперь мне не нужно проверять
$?. Это делает мой код значительно проще и надежнее.если вы столкнетесь с ситуациями, где вы действительно нужно, чтобы отключить это поведение, вы можете либо
catchошибки, или передавать значение определенной функции, используя общие-ErrorAction. В вашем случае вы, вероятно, хотите, чтобы ваш процесс остановился на сначала ошибка, поймать ошибку, а затем зарегистрировать его.обратите внимание, что это не обрабатывает случай, когда внешние исполняемые файлы терпят неудачу (код выхода ненулевой, условно), поэтому вам все равно нужно проверить
$LASTEXITCODEесли вы вызываете какие-либо. Несмотря на это ограничение, установка по-прежнему экономит много кода и усилий.дополнительную надежность
вы также можете рассмотреть возможность использования строгого режима:
Set-StrictMode -Version Latestэто предотвращает PowerShell от молча идет, когда вы используете несуществующую переменную и в других странных ситуациях. (См.
-Versionпараметр для получения подробной информации о том, что он ограничивает.)сочетание этих двух параметров делает PowerShell гораздо более отказоустойчивым языком, что значительно упрощает программирование в нем.
Если вы хотите, чтобы powershell errormessage для командлета был подавлен, но все же хотите поймать ошибку, используйте "-erroraction 'silentlyStop'"
Comments