Aktualisieren :
- Der
if ($LASTEXITCODE -eq 0) ...
wird weiterhin zuverlässig mit externen Programmen funktionieren. - Allerdings, ob und wann die Version vor v7.2 experimentelle Funktion
namens
PSNotApplyErrorActionToStderr
wird ein offizielles Feature,if ($?) ...
wird auch robust funktionieren - siehe diese Antwort für weitere Informationen.
Verwenden Sie $LASTEXITCODE -eq 0
statt $?
um zuverlässig einen Nicht-Null-Exit-Code zu erkennen (typischerweise Signalisierungsfehler) von einem externen Programm gemeldet.
Sie können dann *> $null
verwenden alle Ausgaben kategorisch zu unterdrücken ohne sich Gedanken über die Auswirkungen dieser Umleitung auf $?
machen zu müssen :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Verwendung einer Umleitung, die den Fehlerstream von PowerShell umfasst – entweder explizit über 2>
oder implizit über *>
- bedeutet, dass Daten über diesen Stream empfangen werden - was im Fall des Aufrufs eines externen Programms jede Ausgabe von stderr bedeutet - PowerShell setzt $?
zu $false
.
Im Bereich externer Konsolen-/Terminalprogramme wird stderr jedoch nicht nur zur Ausgabe von error verwendet Informationen, sondern alle Informationen, die keine Daten sind , wie z. B. Statusinformationen. Daher können Sie nicht vom Vorhandensein der stderr-Ausgabe auf einen Fehler schließen .
Externe Konsolen-/Terminalprogramme teilen ihren Erfolgsstatus ausschließlich über ihren Exit-Code mit , die PowerShell im automatischen $LASTEXITCODE
widerspiegelt Variable.
Daraus folgt, dass $?
kann $false
sein auch wenn der Exit-Code 0
ist , ist also kein zuverlässiger Erfolgsindikator - im Gegensatz zu $LASTEXITCODE
.