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