Wie kann ich einen Fehler in Powershell ignorieren und fortsetzen?

42

Ich versuche festzustellen, ob ein Prozess auf mehreren Servern ausgeführt wird, und formatiere ihn dann in eine Tabelle.

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

Das ist der einfache Teil - Wenn der Prozess nicht existiert oder der Server nicht verfügbar ist, gibt Powershell einen großen hässlichen Fehler aus, verunstaltet die Tabelle und fährt nicht fort. Beispiel

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

Wie komme ich darum herum? Wenn ich trotzdem benachrichtigt werden möchte, wenn der Prozess nicht verfügbar ist oder ausgeführt wird.

Jake
quelle

Antworten:

46

Fügen Sie -ErrorAction SilentlyContinueIhrem Befehl hinzu.

Wenn es sich nicht um einen Fehler, sondern um eine nicht behandelte Ausnahme handelt, sollten Sie hinzufügen -EV Err -EA SilentlyContinue, um die Ausnahme abzufangen . ( EAist ein Alias ​​für ErrorAction)

Sie können dann den Fehler in Ihrem Skript auswerten, indem Sie einen Blick darauf werfen $Err[0]

Bart De Vos
quelle
Ich fürchte, das funktioniert nur, wenn ich es an der falschen Stelle stecke. get-process -ComputerName server1, server2, server3 -name explorer -ErrorAction SilentlyContinue | Select-Object-Prozessname, Maschinenname
Jake
Fügen Sie es get-processmeiner aktualisierten Antwort oben hinzu oder werfen Sie einen Blick darauf.
Bart De Vos
13

Kurze Antwort: Fügen Sie $ErrorActionPreference = 'SilentlyContinue'am Anfang Ihres Codes hinzu, damit Sie nicht -ErrorAction SilentlyContinuejeden Befehl hinzufügen müssen

Lange Antwort: https://www.gitbook.com/book/devopscollective/the-big-book-of-powershell-error-handling/details

Tinman
quelle
1
Beachten Sie den Unterschied: 'Continue' (Standardeinstellung) setzt die Ausführung fort, schreibt aber Fehler in die Konsole (welche op loszuwerden scheint, wenn ich sie richtig lese). 'SilentlyContinue' unterdrückt alle Fehlermeldungen vollständig.
Frederik Struck-Schøning
"Fügen Sie $ ErrorActionPreference = 'SilentlyContinue' am Anfang Ihres Codes hinzu" ---> Dies hat wirklich geholfen. Vielen Dank für Ihre Hilfe und die Bereitstellung im Internet.
Nishant