-command's exit code is not the same as a script's exit code
If you look at the part you are sending to -Command
as a script you will see it would never work. The script running the foo.ps1
script does not have a call to exit, so it does not return an exit code.
If you do return an exit code it will do what you want. Also change it from "
to '
, otherwise $lastexitcode
will be resolved before you 'send' the string to the second PowerShell, if you run it from PowerShell.
PS C:\test> powershell -Command './foo.ps1; exit $LASTEXITCODE'
PS C:\test> echo $lastexitcode
42
PS: Also check out the -File
parameter if you just want to run a script. But also know it does not return 1
if you have a terminating error as -Command
does. See here for more on that last topic.
PS C:\test> powershell -File './foo.ps1'
PS C:\test> echo $lastexitcode
42
CAVEAT: If your PowerShell script returns exitcodes HIGHER THAN 65535, they roll over:
$exitCode = 65536
Exit $exitCode
If the following CMD calls this PS1 script above, your will get an %errorlevel% of 0
Powershell.exe "& 'MyPowershellScript.ps1' "; exit $LASTEXITCODE
SET ERR=%ERRORLEVEL%
and an exitcode of 65537 would give you an %errorlevel% of 1, etc.
Meanwhile, if a CMD calls another and the child script returns an errorlevel higher than 65535, it passes through just fine.
Cmd /c exit 86666
The CMD Will return an %errorlevel% of 86666 as expected.
CAVEAT to all of this: Now this is happening on and off for no apparent reason.