2012-05-19 5 views
39

In PowerShell, was ist der Unterschied zwischen $? und $LastExitCode?

Ich las about automatic variables, und es wird gesagt:

$? Contains the execution status of the last operation. It contains TRUE if the last operation succeeded and FALSE if it failed.

$LastExitCode Contains the exit code of the last Windows-based program that was run.

In der Definition von $? es nicht erklären, was mittlere gelingen und scheitern.


Ich frage, weil ich davon ausgegangen, dass $? Wahr ist, wenn und nur wenn $ lastexitcode 0 ist, aber ich fand ein überraschendes Gegenbeispiel: $LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError.

Antwort

42

$LastExitCode ist der Rückkehrcode nativer Anwendungen. $? gibt nur True oder False je nachdem, ob der letzte Befehl (Cmdlets oder nativ) verlassen, ohne Fehler oder nicht.

Für Cmdlets Ausfall bedeutet in der Regel eine Ausnahme, für native Anwendungen ist es ein Nicht-Null-Exit-Code:

PS> cmd /c "exit 5" 
PS> $? 
False 
PS> cmd /c "exit 0" 
PS> $? 
True 

Abbrechen eines Cmdlets mit Ctrl +C auch als Versagen zählen wird; Für native Anwendungen hängt es davon ab, welchen Exit-Code sie setzen.

+0

Danke Joey. Ich selbst dachte $? bedeutete Exit-Code ungleich Null, aber ich habe gerade ein überraschendes Gegenbeispiel gefunden. Siehe http://stackoverflow.com/questions/10666101/powershell-lassexitcode-0-but-false-redirecting-stderr-to-stdout-gives-nat –

+1

Das ist ein interessanter. Ich würde glauben, dass dies ein Fehler ist (weil er sich inkonsistent zwischen verschiedenen PowerShell-Hosts verhält). – Joey

+0

Und verschiedene Cmdlets: @iex abcde @ für Beispiel gibt weder $? = False oder $ LastExitCode> 0 zurück – majkinetor