Powershell: как я могу остановить отображение ошибок в сценарии?



когда мой сценарий PowerShell пытается, например, создать объект SQL Server для несуществующего сервера ("bla" в моем случае), PowerShell отображает множество ошибок PowerShell красным цветом.



Так как мой скрипт проверяет значение $? после таких вызовов и отображений и ошибок журналов я бы предпочел не отображать несколько строк ошибок PowerShell.



Как я могу отключить те, которые отображаются для моего скрипта?

791   5  

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

    Ничего не найдено.