Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 "