Jak zignorować błąd w programie Powershell i pozwolić mu kontynuować?

42

Próbuję sprawdzić, czy proces działa na wielu serwerach, a następnie sformatować go w tabeli.

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

To łatwa część - gdy proces nie istnieje lub jeśli serwer jest niedostępny, PowerShell generuje duży brzydki błąd, psuje tabelę i nie kontynuuje. Przykład

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

Jak to obejść? Jeśli nadal chcę otrzymywać powiadomienia, jeśli proces nie jest dostępny lub działa.

Jake
źródło

Odpowiedzi:

46

Dodaj -ErrorAction SilentlyContinuedo swojego polecenia.

Jeśli nie jest to błąd, ale nieobsługiwany wyjątek, należy dodać -EV Err -EA SilentlyContinue, aby złapać wyjątek. ( EAjest pseudonimem dla ErrorAction)

Następnie możesz ocenić błąd w skrypcie, sprawdzając $Err[0]

Bart De Vos
źródło
Obawiam się, że to nie działa, chyba że przykleję go w niewłaściwym miejscu. get-process -ComputerName server1, server2, server3 -name explorer -ErrorAction SilentlyContinue | Select-Object processname, machinename
Jake
Dodaj go get-processlub spójrz na moją zaktualizowaną odpowiedź powyżej.
Bart De Vos,
13

Krótka odpowiedź: dodaj $ErrorActionPreference = 'SilentlyContinue'na początku kodu, więc nie musisz dodawać -ErrorAction SilentlyContinuedo każdego polecenia

Długa odpowiedź: https://www.gitbook.com/book/devopscollective/the-big-book-of-powershell-error-handling/details

Tin Man
źródło
1
Zwróć uwagę na różnicę: „Kontynuuj” (ustawienie domyślne) kontynuuje wykonywanie, ale zapisuje błędy w konsoli (której op wydaje się chcieć pozbyć, jeśli poprawnie go odczytam). „SilentlyContinue” całkowicie pomija wszystkie komunikaty o błędach.
Frederik Struck-Schøning,
„Dodaj $ ErrorActionPreference = 'SilentlyContinue' na początku kodu” ---> To naprawdę pomogło, więc bardzo dziękuję za pomoc i udostępnienie jej w Internecie.
Nishant