CMD && and || operators work as expected when I use node.js to set ERRORLEVEL:
Microsoft Windows [Version 10.0.19044.1645]
(c) Microsoft Corporation. All rights reserved.
C:\Users\Blaine>node -e "process.exit(0)"
C:\Users\Blaine>echo %ERRORLEVEL%
0
C:\Users\Blaine>node -e "process.exit(1)"
C:\Users\Blaine>echo %ERRORLEVEL%
1
C:\Users\Blaine>node -e "process.exit(2)"
C:\Users\Blaine>echo %ERRORLEVEL%
2
C:\Users\Blaine>node -e "process.exit(0)" && echo expected
expected
C:\Users\Blaine>node -e "process.exit(1)" || echo expected
expected
C:\Users\Blaine>node -e "process.exit(2)" || echo expected
expected
C:\Users\Blaine>node -e "process.exit(0)" || echo UNexpected
C:\Users\Blaine>node -e "process.exit(1)" && echo UNexpected
C:\Users\Blaine>node -e "process.exit(2)" && echo UNexpected
C:\Users\Blaine>
But behavior is different and unexpected when I use CMD scripts 'exit0.cmd', 'exit1.cmd, 'exit2.cmd' which are:
@echo off
exit /b 0
and
@echo off
exit /b 1
and
@echo off
exit /b 2
ERRORLEVEL gets set exactly the same as for the node.js executions:
C:\Users\Blaine\tmp>exit0
C:\Users\Blaine\tmp>echo %ERRORLEVEL%
0
C:\Users\Blaine\tmp>exit1
C:\Users\Blaine\tmp>echo %ERRORLEVEL%
1
C:\Users\Blaine\tmp>exit2
C:\Users\Blaine\tmp>echo %ERRORLEVEL%
2
but && and || don't work right for non-0 ERRORLEVELS:
C:\Users\Blaine\tmp>exit0 && echo expected
expected
C:\Users\Blaine\tmp>exit0 || echo UNexpected
C:\Users\Blaine\tmp>exit1 && echo UNexpected
UNexpected
C:\Users\Blaine\tmp>exit1 || echo expected
C:\Users\Blaine\tmp>exit2 && echo UNexpected
UNexpected
C:\Users\Blaine\tmp>exit2 || echo expected
C:\Users\Blaine\tmp>
What the hell is going on?