Chcę, aby mój skrypt PowerShell przestał działać, gdy którekolwiek z poleceń, które wykonuję, zawiodły (jak set -e
w bash). Używam zarówno poleceń Powershell ( New-Object System.Net.WebClient
), jak i programów ( .\setup.exe
).
źródło
Chcę, aby mój skrypt PowerShell przestał działać, gdy którekolwiek z poleceń, które wykonuję, zawiodły (jak set -e
w bash). Używam zarówno poleceń Powershell ( New-Object System.Net.WebClient
), jak i programów ( .\setup.exe
).
$ErrorActionPreference = "Stop"
dostarczy ci część drogi (to działa świetnie dla poleceń cmdlet).
Jednak w przypadku plików EXE będziesz musiał sprawdzić $LastExitCode
się po każdym wywołaniu exe i ustalić, czy nie powiodło się. Niestety nie sądzę, aby PowerShell mógł tutaj pomóc, ponieważ w systemie Windows pliki EXE nie są strasznie spójne z kodem wyjścia „sukcesu” lub „niepowodzenia”. Większość z nich przestrzega standardu UNIX 0, co oznacza sukces, ale nie wszystkie. Sprawdź funkcję CheckLastExitCode w tym poście na blogu . Może ci się przydać.
$ErrorActionPreference = "Stop"
działa dla dobrze wychowanych programów (które zwracają 0 po sukcesie)?throw "$exe failed with exit code $LastExitCode"
Gdzie $ exe jest tylko ścieżką do EXE.Powinieneś być w stanie to osiągnąć za pomocą instrukcji
$ErrorActionPreference = "Stop"
na początku skryptu.Domyślne ustawienie
$ErrorActionPreference
toContinue
, dlatego skrypty nadal działają po wystąpieniu błędów.źródło
Niestety, z powodu błędnych poleceń cmdlet, takich jak New-RegKey i Clear-Disk , żadna z tych odpowiedzi nie jest wystarczająca. W tej chwili zdecydowałem się na następujące wiersze u góry dowolnego skryptu PowerShell, aby zachować zdrowie psychiczne.
a następnie każda rozmowa natywna otrzymuje takie leczenie:
Ten natywny wzorzec połączeń powoli staje się dla mnie na tyle powszechny, że prawdopodobnie powinienem rozważyć opcje jego zwięzłości. Nadal jestem nowicjuszem PowerShell, więc sugestie są mile widziane.
źródło
Potrzebujesz nieco innej obsługi błędów dla funkcji PowerShell i wywoływania exe, i musisz koniecznie powiedzieć wywołującemu skryptowi, że się nie udało. Opierając się na
Exec
bibliotece Psake, skrypt o poniższej strukturze zatrzyma się na wszystkich błędach i jest użyteczny jako podstawowy szablon dla większości skryptów.źródło
Exec { sqlite3.exe -bail some.db "$SQL" }
The-bail
powoduje błąd, ponieważ stara się interpretować go jako parametr apletu polecenia? Zawijanie rzeczy w cytaty wydaje się nie działać. Jakieś pomysły?Drobna modyfikacja odpowiedzi z @alastairtree:
Kluczowe różnice tutaj:
Invoke-Command
)-ErrorAction
zachowanie z wbudowanych poleceń cmdletźródło
Invoke-Call { dotnet build $something }
& @ScriptBlock
i& $ScriptBlock
wydaje się, że robią to samo. Nie mogłem google, jaka jest różnica w tym przypadkuJestem nowy w PowerShell, ale wydaje się to najbardziej skuteczne:
źródło
Przybyłem tutaj, szukając tego samego. $ ErrorActionPreference = „Stop” zabija moją powłokę natychmiast, gdy wolę zobaczyć komunikat o błędzie (pauza) przed jego zakończeniem. Opierając się na mojej wrażliwości partii:
Przekonałem się, że działa to tak samo dla mojego konkretnego skryptu ps1:
źródło
Wydaje
stderr
się,stdout
że przekierowanie do robi to samo bez żadnych innych poleceń / bloków skryptów, chociaż nie mogę znaleźć wyjaśnienia, dlaczego tak działa ...Spowoduje to wyświetlenie następujących danych zgodnie z oczekiwaniami (polecenie
aws s3 ...
zwraca$LASTEXITCODE = 255
)źródło