Powershell: как остановить отображение ошибок в скрипте? - PullRequest
69 голосов
/ 05 декабря 2011

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

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

Как отключить отображаемые длямой сценарий?

Ответы [ 6 ]

105 голосов
/ 05 декабря 2011

У вас есть несколько вариантов.Самое простое - использовать настройки ErrorAction.

-Erroraction - это универсальный параметр для всех командлетов.Если есть специальные команды, которые вы хотите игнорировать, вы можете использовать -erroraction 'silentlycontinue', который в основном будет игнорировать все сообщения об ошибках, генерируемые этой командой.Также можно использовать значение Ignore (в PowerShell 3 +):

В отличие от SilentlyContinue, Ignore не добавляет сообщение об ошибке в автоматическую переменную $ Error.

Если вы хотите игнорировать все ошибки в скрипте, вы можете использовать системную переменную $ErrorActionPreference и сделать то же самое: $ErrorActionPreference= 'silentlycontinue'

См. about_CommonParameters для получения дополнительной информации о -ErrorAction,См. about_preference_variables для получения дополнительной информации о $ ErrorActionPreference.

15 голосов
/ 05 декабря 2011

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

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

EX:

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

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

6 голосов
/ 06 декабря 2011

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

Е.Г.

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}
1 голос
/ 15 мая 2018

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

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

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

$ErrorActionPreference = 'Stop'

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

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

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

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

Возможно, вы захотите использовать строгий режим :

Set-StrictMode -Version Latest

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

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

0 голосов
/ 12 июня 2019

Добавьте -ErrorAction SilentlyContinue к вашему сценарию, и все будет хорошо.

0 голосов
/ 20 октября 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...