2011-12-05 16 views
51

Kiedy mój skrypt PowerShell próbuje, na przykład, utworzyć obiekt SQL Server dla serwera, który nie istnieje ("bla" w moim przypadku), PowerShell wyświetla wiele błędów PowerShell na czerwono.Powershell: Jak mogę zatrzymać wyświetlanie błędów w skrypcie?

Ponieważ mój skrypt sprawdza wartość $? po takich wywołaniach i wyświetla i rejestruje błędy, wolałbym nie wyświetlać kilku wierszy błędów PowerShell.

Jak mogę dezaktywować wyświetlanie dla mojego skryptu?

Odpowiedz

79

Masz kilka opcji. Najłatwiejsze jest korzystanie z ustawień ErrorAction.

to uniwersalny parametr dla wszystkich poleceń cmdlet. Jeśli istnieją specjalne polecenia, które chcesz zignorować, możesz użyć -erroraction 'silentlycontinue', które zasadniczo zignorują wszystkie komunikaty o błędach wygenerowane przez to polecenie. Można również użyć wartości Ignore (w PowerShell 3+):

przeciwieństwie SilentlyContinue, ignorowanie nie dodaje się komunikat o błędzie do zmiennej automatycznej $ Error.

Jeśli chcesz ignorować wszystkie błędy w skrypcie, można użyć zmiennej systemowej $ErrorAction i zrobić to samo: $ErrorActionPreference= 'silentlycontinue'

Zobacz about_CommonParameters aby uzyskać więcej informacji.

+7

Ustawienie zmiennej systemowej „-erroraction«silentlyStop»” to podstęp. –

12

Windows PowerShell udostępnia dwa mechanizmy raportowania błędów: jeden mechanizm kończące błędów i inny mechanizm nie kończące błędów.

Wewnętrzny kod CmdLets może wywoływać metodę ThrowTerminatingError, gdy wystąpi błąd, który nie pozwala lub nie powinien pozwalać obiektowi cmdlet kontynuować przetwarzanie jego obiektów wejściowych. Autor skryptu może użyć wyjątku, aby złapać ten błąd.

EX:

try 
{ 
    Your database code 
} 
catch 
{ 
    Error reporting/logging 
} 

cmdlets wewnętrzny kod może wywołać metodę WriteError zgłosić błędów braku wypowiedzenia, gdy cmdlet można kontynuować przetwarzania obiektów wejściowych. Program piszący scenariusze może następnie użyć opcji -ErrorAction, aby ukryć wiadomości, lub użyć parametru $ErrorActionPreference, aby skonfigurować całe zachowanie skryptu.

6

Miałem podobny problem, gdy próbowałem rozwiązać nazwy hostów przy użyciu [system.net.dns]. Jeśli adres IP nie został rozwiązany .Net popełnił błąd zakończenia. Aby zapobiec błędowi zakończenia i nadal zachować kontrolę nad wyjściem, utworzyłem funkcję przy użyciu TRAP.

E.G.

Function Get-IP 
{PARAM ([string]$HostName="") 
PROCESS {TRAP 
      {"" ;continue} 
      [system.net.dns]::gethostaddresses($HostName) 
     } 
} 
-1

Jeśli chcesz ErrorMessage powershell dla cmdletu stłumione, ale nadal chcą nadrobić ten błąd, należy

+0

Nie ma takiej akcji. Chociaż istnieje akcja Stop. –

Powiązane problemy