Когда мой сценарий PowerShell пытается, например, создать объект SQL Server для несуществующего сервера (в моем случае «bla»), PowerShell отображает множество ошибок PowerShell красным цветом.
Поскольку мой сценарий проверяет значение $?
после таких вызовов, а также отображает и регистрирует ошибки, я бы предпочел не отображать несколько строк с ошибками PowerShell.
Как я могу отключить те, которые отображаются для моего скрипта?
источник
-ErrorAction:SilentlyContinue
в PS 5.1. Я вызывал свой командлет из пакета, поэтому не знаю, имеет ли это значение. Но хорошая информация, когда вы знаете, что допустимая ошибка может быть выброшена.Windows PowerShell предоставляет два механизма для сообщения об ошибках: один механизм для прерывания ошибок и другой механизм для непрерывных ошибок .
Внутренний код CmdLets может вызывать
ThrowTerminatingError
метод при возникновении ошибки, которая не позволяет или не должна позволять командлету продолжать обработку своих входных объектов. Автор сценария может использовать исключение, чтобы отловить эту ошибку.EX:
Внутренний код CmdLets может вызывать
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
, вызываете ли вы какой-либо. Несмотря на это ограничение, настройка по-прежнему позволяет сэкономить много кода и усилий.Дополнительная надежность
Вы также можете рассмотреть возможность использования строгого режима :
Это препятствует тому, чтобы PowerShell молча продолжал работу, когда вы используете несуществующую переменную и в других странных ситуациях. (
-Version
Подробнее о том, что он ограничивает, см. В параметре.)Сочетание этих двух настроек делает PowerShell гораздо более отказоустойчивым языком, что значительно упрощает программирование на нем.
источник
Добавьте
-ErrorAction SilentlyContinue
в свой сценарий, и все будет хорошо.источник
В некоторых случаях вы можете передать после команды Out-Null
command | Out-Null
источник
Если вы хотите, чтобы сообщение об ошибке PowerShell для командлета было подавлено, но все же хотите перехватить ошибку, используйте «-erroraction 'silentlyStop'»
источник
New-Item -ItemType directory
(PowerShell v2.0)