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 предоставляет два механизма для сообщения об ошибках: один механизм для неустранимых ошибок и еще один механизм непрерывающие ошибки.

внутренний код командлетов может вызывать ThrowTerminatingError метод при возникновении ошибки, которая не позволяет или не должна позволять командлету продолжать обработку входных объектов. Сценарист может использовать исключение, чтобы поймать эту ошибку.

EX:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

Внутренние Командлеты код может вызвать WriteError метод для сообщения о неустранимых ошибках, когда командлет может продолжить обработку входных объектов. Затем сценарист может использовать параметр-ErrorAction для скрытия сообщений или использовать $ErrorActionPreference для настройки всего поведения скрипта.


у меня была аналогичная проблема при попытке разрешить имя хоста, используя [system.net.dns]. Если IP не разрешен .Нэт бросил неустранимая ошибка. Чтобы предотвратить ошибку завершения и сохранить контроль над выходом, я создал функцию с помощью TRAP.

Г. Е.

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}

Вы делаете это неправильно.

у вас уже есть хорошее, большое сообщение об ошибке. Почему вы хотите написать код, который проверяет $? явно после одной командой? Это чрезвычайно громоздко и подвержено ошибкам. Правильное решение -прекратить проверку $?.

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

$ErrorActionPreference = 'Stop'

я поставил это в верхней части каждого сценария, который я когда-либо писал, и теперь мне не нужно проверять $?. Это делает мой код намного проще и надежнее.

если вы столкнетесь с ситуациями, где вы действительно нужно, чтобы отключить это поведение, вы можете либо catch ошибка или передать настройку определенной функции с помощью common -ErrorAction. В вашем случае вы, вероятно, хотите, чтобы ваш процесс остановился на сначала ошибка, поймать ошибку, а затем зарегистрировать его.

обратите внимание, что это не обрабатывает случай, когда внешние исполняемые файлы терпят неудачу (код выхода ненулевой, обычно), поэтому вам все равно нужно проверить $LASTEXITCODE если вы вызываете какие-либо. Несмотря на это ограничение, настройка по-прежнему экономит много кода и усилий.

дополнительную надежность

вы также можете рассмотреть возможность использования строгого режима:

Set-StrictMode -Version Latest

это предотвращает PowerShell от молча идет, когда вы используете несуществующую переменную и в других странных ситуациях. (См. -Version параметр для подробностей о том, что он ограничивает.)

объединение этих двух параметров делает PowerShell гораздо более быстрым языком, что значительно упрощает программирование на нем.


Если вы хотите, чтобы powershell errormessage для командлета подавлен, но все еще хотите поймать ошибку, используйте "- erroraction 'silentlyStop'"