$ErrorActionPreference = "Stop"
Sie erhalten einen Teil des Weges dorthin (dh dies funktioniert hervorragend für Cmdlets).
Für EXEs müssen Sie $LastExitCode
sich jedoch nach jedem Exe-Aufruf selbst überprüfen und feststellen, ob dies fehlgeschlagen ist oder nicht. Leider glaube ich nicht, dass PowerShell hier helfen kann, da EXEs unter Windows nicht besonders konsistent sind, was einen Exit-Code für "Erfolg" oder "Fehler" ausmacht. Die meisten folgen dem UNIX-Standard 0, was auf Erfolg hinweist, aber nicht alle. Überprüfen Sie die CheckLastExitCode-Funktion in diesem Blog-Beitrag . Vielleicht finden Sie es nützlich.
$ErrorActionPreference = "Stop"
für gut erzogene Programme (die bei Erfolg 0 zurückgeben)?throw "$exe failed with exit code $LastExitCode"
wo $ exe nur der Pfad zu ist die EXE.Sie sollten dies erreichen können, indem Sie die Anweisung
$ErrorActionPreference = "Stop"
am Anfang Ihrer Skripte verwenden.Die Standardeinstellung
$ErrorActionPreference
istContinue
, weshalb Ihre Skripte nach Auftreten von Fehlern weiterhin ausgeführt werden.quelle
Leider reicht aufgrund fehlerhafter Cmdlets wie New-RegKey und Clear-Disk keine dieser Antworten aus. Ich habe mich derzeit in den folgenden Zeilen oben in einem Powershell-Skript niedergelassen, um meine geistige Gesundheit zu erhalten.
und dann bekommt jeder native Anruf diese Behandlung:
Dieses native Anrufmuster wird für mich langsam so häufig, dass ich wahrscheinlich nach Optionen suchen sollte, um es prägnanter zu gestalten. Ich bin immer noch ein Powershell-Neuling, daher sind Vorschläge willkommen.
quelle
Sie benötigen eine etwas andere Fehlerbehandlung für Powershell-Funktionen und zum Aufrufen von Exes, und Sie müssen dem Aufrufer Ihres Skripts unbedingt mitteilen, dass es fehlgeschlagen ist. Aufbauend auf
Exec
der Bibliothek Psake stoppt ein Skript mit der folgenden Struktur alle Fehler und kann als Basisvorlage für die meisten Skripte verwendet werden.quelle
Exec { sqlite3.exe -bail some.db "$SQL" }
, die-bail
einen Fehler verursacht , da er es als Cmdlets Parameter zu interpretieren versucht? Dinge in Anführungszeichen zu setzen scheint nicht zu funktionieren. Irgendwelche Ideen?Eine geringfügige Änderung der Antwort von @alastairtree:
Die Hauptunterschiede hier sind:
Invoke-Command
)-ErrorAction
Verhalten von eingebauten Cmdlets nachquelle
Invoke-Call { dotnet build $something }
& @ScriptBlock
und& $ScriptBlock
scheinen das gleiche zu tun. Ich konnte nicht googeln, was der Unterschied in diesem Fall istIch bin neu in Powershell, aber das scheint am effektivsten zu sein:
quelle
Ich bin hierher gekommen, um dasselbe zu suchen. $ ErrorActionPreference = "Stop" beendet meine Shell sofort, wenn ich die Fehlermeldung (Pause) lieber sehen möchte, bevor sie beendet wird. Auf meine Batch-Sensibilität zurückgreifen:
Ich fand, dass dies für mein spezielles ps1-Skript ziemlich gleich funktioniert:
quelle
Das Umleiten
stderr
nachstdout
scheint den Trick auch ohne andere Befehle / Scriptblock-Wrapper zu tun, obwohl ich keine Erklärung dafür finden kann, warum es so funktioniert.Dies gibt wie erwartet Folgendes aus (der Befehl gibt
aws s3 ...
zurück$LASTEXITCODE = 255
)quelle