Gdy mój skrypt PowerShell próbuje na przykład utworzyć obiekt SQL Server dla serwera, który nie istnieje (w moim przypadku „bla”), program PowerShell wyświetla wiele błędów programu PowerShell na czerwono.
Ponieważ mój skrypt sprawdza wartość $?
po takich wywołaniach oraz wyświetla i rejestruje błędy, wolałbym nie wyświetlać również kilku wierszy błędów programu PowerShell.
Jak mogę dezaktywować te wyświetlane w moim skrypcie?
źródło
-ErrorAction:SilentlyContinue
w PS 5.1. Dzwoniłem do mojego polecenia cmdlet z partii, więc nie wiem, czy to robi różnicę. Ale dobre informacje, gdy wiesz, że dopuszczalny błąd mogą zostać wyrzucone.Program Windows PowerShell udostępnia dwa mechanizmy raportowania błędów: jeden mechanizm przerywania błędów i drugi mechanizm niepowodujący zakończenia błędów .
Kod wewnętrzny CmdLets może wywołać
ThrowTerminatingError
metodę, gdy wystąpi błąd, który nie pozwala lub nie powinien zezwalać cmdletowi na dalsze przetwarzanie jego obiektów wejściowych. Osoba pisząca skrypt może użyć wyjątku, aby wyłapać te błędy.EX:
try { Your database code } catch { Error reporting/logging }
Wewnętrzny kod CmdLets może wywołać
WriteError
metodę w celu zgłoszenia błędów niepowodujących zakończenia, gdy polecenie cmdlet może kontynuować przetwarzanie obiektów wejściowych. Twórca skryptu może następnie użyć opcji -ErrorAction, aby ukryć komunikaty, lub użyć$ErrorActionPreference
do ustawienia zachowania całego skryptu.źródło
Miałem podobny problem, gdy próbowałem rozwiązać nazwy hostów za pomocą
[system.net.dns]
. Jeśli adres IP nie został rozwiązany .Net wyrzucił błąd powodujący zakończenie. Aby zapobiec błędowi kończącemu i nadal zachować kontrolę nad wyjściem, utworzyłem funkcję przy użyciuTRAP
.NA PRZYKŁAD
Function Get-IP {PARAM ([string]$HostName="") PROCESS {TRAP {"" ;continue} [system.net.dns]::gethostaddresses($HostName) } }
źródło
Jesteś daleko od celu.
Masz już ładny, duży komunikat o błędzie. Dlaczego na Ziemi miałbyś chcieć napisać kod, który sprawdza
$?
jawnie po każdym poleceniu ? Jest to niezwykle uciążliwe i podatne na błędy. Prawidłowym rozwiązaniem jest zaprzestanie sprawdzania$?
.Zamiast tego użyj wbudowanego mechanizmu PowerShell, aby wysadzić w powietrze. Możesz to włączyć, ustawiając preferencję błędu na najwyższy poziom:
$ErrorActionPreference = 'Stop'
Umieszczam to na początku każdego skryptu, który kiedykolwiek napisałem, i teraz nie muszę tego sprawdzać
$?
. To sprawia, że mój kod jest znacznie prostszy i bardziej niezawodny.Jeśli napotkasz sytuacje, w których naprawdę musisz wyłączyć to zachowanie, możesz albo
catch
błąd, albo przekazać ustawienie do określonej funkcji przy użyciu funkcji common-ErrorAction
. W Twoim przypadku prawdopodobnie chcesz, aby proces zatrzymał się przy pierwszym błędzie, złapał błąd, a następnie zarejestrował go.Zwróć uwagę, że nie obsługuje to przypadku, gdy zewnętrzne pliki wykonywalne zawodzą (zwykle kod zakończenia niezerowy), więc nadal musisz sprawdzić,
$LASTEXITCODE
czy któreś wywołujesz. Pomimo tego ograniczenia, ustawienie nadal oszczędza dużo kodu i wysiłku.Dodatkowa niezawodność
Możesz również rozważyć użycie trybu ścisłego :
Set-StrictMode -Version Latest
Zapobiega to dyskretnemu kontynuowaniu programu PowerShell, gdy używasz nieistniejącej zmiennej oraz w innych dziwnych sytuacjach. (Zobacz
-Version
parametr, aby uzyskać szczegółowe informacje o tym, co ogranicza).Połączenie tych dwóch ustawień sprawia, że PowerShell jest znacznie bardziej odporny na awarie, co znacznie ułatwia programowanie w nim.
źródło
Dodaj
-ErrorAction SilentlyContinue
do swojego scenariusza, a będziesz gotowy.źródło
W niektórych przypadkach można potokować po poleceniu Out-Null
command | Out-Null
źródło
Jeśli chcesz, aby komunikat o błędzie programu PowerShell dla polecenia cmdlet został pominięty, ale nadal chcesz go wychwycić, użyj opcji „-erroraction 'silentlyStop'”
źródło
New-Item -ItemType directory
(PowerShell v2.0)