This is the follow-up post of the previous PowerShell and Control-M. There is one scenario I haven’t discussed: how to get the cmd.exe batch result from PowerShell.
This is not a new question but there is no clear answer you could find in Internet. Here is a post from PowerShell team: ErrorLevel equivalent, you could read that $LASTEXITCODE is designed as equivalent to %ErrorLevel%
In Cmd.exe, %ErrorLevel% is a builtin variable which indicates the success or failure of the last executable run.
$LASTEXITCODE, Contains the exit code of the last Win32 executable execution.
With the cmd.exe batch, the observed result of %ErrorLevel% and $LASTEXITCODE are different in some cases. %ErrorLevel% would not be changed for the “internal” batch command like “GOTO”, but $LASTEXITCODE result will be changed. Below is one example, which is a command batch template with error handling in the old days.
@echo off ping %1 if %errorlevel% NEQ 0 GOTO :Error echo %1 is reachable. GOTO :End :Error echo Error happens, %1 is not reachable. :End
If the batch is ran in cmd.exe, 127.0.0.1 and 999.999.999.999 are passed as parameter, expected %ErrorLevel% result 0 and 1 are returned.
How to address
We can add one exit code as the last commend in the batch file to align the $LASTEXITCODE result same as %ErrorLevel%.
Below is the updated version of the sample:
REM Sample 2, with exit line @echo off ping %1 if %errorlevel% NEQ 0 GOTO :Error echo %1 is reachable. GOTO :End :Error echo Error happens, %1 is not reachable. :End exit /b %errorlevel%
So to the PowerShell + Control-M combination, we will need to add exit /b %errorlevel% to the cmd wrapper template for case like PowerShell script recursion.
Posted by Shiyang Qiu, Aug 10, 2016