103

In PowerShell, what is the difference between $? and $LastExitCode?

I read about automatic variables, and it said:

$? 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 the definition of $? it doesn't explain what succeed and fail mean.


I ask because I presumed that $? is True if and only if $LastExitCode is 0, but I found a surprising counter-example: $LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError.

Community
  • 1
  • 1
Colonel Panic
  • 132,665
  • 89
  • 401
  • 465

1 Answers1

116

$LastExitCode is the return code of native applications. $? just returns True or False depending on whether the last command (cmdlet or native) exited without error or not.

For cmdlets failure usually means an exception, for native applications it's a non-zero exit code:

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

Cancelling a cmdlet with Ctrl+C will also count as failure; for native applications it depends on what exit code they set.

Joey
  • 344,408
  • 85
  • 689
  • 683
  • 1
    Thanks Joey. I myself thought $? meant non-zero exit code, but I've just found a surprising counterexample. See http://stackoverflow.com/questions/10666101/powershell-lastexitcode-0-but-false-redirecting-stderr-to-stdout-gives-nat – Colonel Panic May 19 '12 at 14:43
  • 1
    That's an interesting one. I would believe this to be a bug (because it behaves inconsistently between different PowerShell hosts). – Joey May 19 '12 at 14:55
  • And different cmdlets: @iex abcde@ for instance returns neither $?=False or $LastExitCode > 0 – majkinetor Aug 22 '13 at 08:01