≡ Menu

What is $LASTEXITCODE and $? In Powershell

In this post, I will talk about two powershell built-in variables that tells if last command/script executed successfully or failed.

As you start writing more sophisticated scripts using Powershell, it is important to perform proper error handling in the scripts. There are several mechanisms available in PS to perform error handling. In this post, I will talk about basic methods which you can use either in scripts or from command lines easily.

Powershell has two built-in variables $LASTEXITCODE and $? which can tell if the last executed script/code/win32 executable completed successfully or in error

$LASTEXITCODE:

This is equivalent to %errorlevel% variable in cmd shell. When you execute a command in cmd.exe the execution status is stored in %errorlevel% variable which can be used in batch scripting to determine the execution status of previous command. Similarly in Powershell, when a win32 executable is executed, the return code is stored in $LASTEXITCODE variable. Generally a zero(0) value in $LASTEXITCODE is treated as success and any other non-zero are treated as failures. You can also choose to perform actions based on the return code of the executable.

Example:

PS C:\scripts>$LASTEXITCODE=0

PS C:\scripts> sc.exe query spooler1

[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

The specified service does not exist as an installed service.

PS C:\scripts> $LASTEXITCODE

1060

PS C:\scripts> sc.exe query spooler

SERVICE_NAME: spooler

        TYPE               : 110  WIN32_OWN_PROCESS  (interactive)

        STATE              : 4  RUNNING

                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)

        WIN32_EXIT_CODE    : 0  (0x0)

        SERVICE_EXIT_CODE  : 0  (0x0)

        CHECKPOINT         : 0x0

        WAIT_HINT          : 0x0

PS C:\scripts> $LASTEXITCODE

0

PS C:\scripts>

In above examples, when I queried for spooler1 service(non-existing one) the value of $LASTEXITCODE is changed to 1060, the return code from sc.exe

The $? Variable:

This is another built-in variable in Powershell which has the same functionality of $LASTEXITCODE except that it stores the execution status of last powershell command AND win32 applications execution status. You can use this in Powershell scripts or while executing one-liners from powershell console. This variable won’t tell the return code, but it tells you whether the last PS command or Win32 executable executed successfully or not. That means, it will contain either of two values, $TRUE or $FALSE. When a command is executed successfully, this variable value is changed to $TRUE. Similarly, it is changed to $FALSE when the last PS command is failed. See below examples for more clarity

PS C:\scripts> Get-Service -Name adfasdf

Get-Service : Cannot find any service with service name ‘adfasdf’.

At line:1 char:12

+ Get-Service <<<<  -Name adfasdf

    + CategoryInfo          : ObjectNotFound: (adfasdf:String) [Get-Service], ServiceCommandException

    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand

 

PS C:\scripts> Get-Service -Name adfasdf

Get-Service : Cannot find any service with service name ‘adfasdf’.

At line:1 char:12

+ Get-Service <<<<  -Name adfasdf

    + CategoryInfo          : ObjectNotFound: (adfasdf:String) [Get-Service], ServiceCommandException

    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand

 

PS C:\scripts> $?

False

PS C:\scripts>

You can also use this variable inside your script to know the status of previous executed PS command status. See below script for usage criteria.

Get-Service -Name Spooler1            
if($?) {            
Write-Host "The last PS command executed successfully"            
} else {            
write-host "The last PS command failed"            
}            

Get-Service -Name Spooler            
if($?) {            
Write-Host "The last PS command executed successfully"            
} else {            
write-host "The last PS command failed"            
}

Hope this helps…

{ 3 comments… add one }
  • micha Oren November 8, 2015, 2:56 pm

    Thank you,
    Very nice detailed post.

Leave a Comment