Как игнорировать ошибку в Powershell и позволить ей продолжаться?

42

Я пытаюсь увидеть, запущен ли процесс на нескольких серверах, а затем отформатировать его в таблицу.

get-process -ComputerName server1,server2,server3 -name explorer | Select-Object processname,machinename

Это самая простая часть: когда процесс не существует или сервер недоступен, powershell выдает большую ужасную ошибку, портит таблицу и не продолжает работу. пример

Get-Process : Couldn't connect to remote machine.At line:1 char:12 + get-process <<<<  -ComputerName server1,server2,server3 -name explorer | format-table processname,machinename
+ CategoryInfo          : NotSpecified: (:) [Get-Process], InvalidOperatio   nException    + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.Power   Shell.Commands.GetProcessCommand

Как мне обойти это? Если я все еще хотел бы получать уведомления, если процесс недоступен или запущен.

Джейк
источник

Ответы:

46

Добавьте -ErrorAction SilentlyContinueк вашей команде.

Если это не ошибка, а необработанное исключение, вы должны добавить -EV Err -EA SilentlyContinue, чтобы перехватить исключение. ( EAэто псевдоним для ErrorAction)

Затем вы можете оценить ошибку в вашем скрипте, посмотрев на $Err[0]

Барт Де Вос
источник
Боюсь, это не сработает, если я не вставлю это в неправильное место. get-process -ComputerName server1, server2, server3-explorer имени -ErrorAction SilentlyContinue | Select-Object имя процесса, машинное имя
Джейк
Добавьте get-processили посмотрите на мой обновленный ответ выше.
Барт Де Вос
13

Краткий ответ: добавьте $ErrorActionPreference = 'SilentlyContinue'в начале вашего кода, чтобы вам не нужно было добавлять -ErrorAction SilentlyContinueк каждой команде

Длинный ответ: https://www.gitbook.com/book/devopscollective/the-big-book-of-powershell-error-handling/details

Железный человек
источник
1
Обратите внимание на разницу: «Продолжить» (настройка по умолчанию) продолжает выполнение, но записывает ошибки в консоль (от которой, похоже, захочется избавиться, если я правильно его прочитал). «SilentlyContinue» полностью подавляет все сообщения об ошибках.
Фредерик Штрук-Шенинг,
"Добавить $ ErrorActionPreference = 'SilentlyContinue' в начале вашего кода" ---> Это действительно помогло, поэтому большое спасибо за вашу помощь и за то, что она доступна в Интернете.
Нишант