Exiting batch with `EXIT /B X` where X>=1 acts as if command completed successfully when using && or || operators between batch calls
Solution 1
If you ask me, exit codes in batch files are broken for this exact reason, but there is a hacky workaround you can use. As the last line of your batch file, use:
@%COMSPEC% /C exit 1 >nul
Since this is an actual process that is started you get a real process exit code and && and || will work.
Solution 2
It works as it should when using call to execute batch scripts containing an exit statement:
C:\>echo @EXIT /B 1 > a.bat
C:\>call a.bat && echo yes
C:\>call a.bat || echo yes
yes
By the way, it says wrongly on Microsoft docs:
Call has no effect at the command prompt when it is used outside of a script or batch file.
Jordan Evens
Updated on June 05, 2022Comments
-
Jordan Evens about 2 years
I'm trying to chain a series of .bat files using the
EXIT /B X
command to return success or failure and&&
and||
for conditional running of the next .bat (e.g.a.bat && b.bat
).Regardless of whether I call
EXIT /B 0
or anything else to end a.bat,a.bat && b.bat
will call b.bat afterward. My understanding is thatEXIT /B 0
should setERRORLEVEL=0
, which is success, so the&&
should continue. The counterpoint to this is that callingEXIT /B 1
should setERRORLEVEL=1
which is failure, so the&&
should stop. What am I missing here?Trivialized example:
For non-batch commands, acting as expected:
C:\> echo test|findstr test>NUL && echo yes yes C:\> echo test|findstr test>NUL || echo yes C:\> echo test|findstr nope>NUL && echo yes C:\> echo test|findstr nope>NUL || echo yes yes
Using
EXIT /B
always sees a.bat as successful:C:\> echo @EXIT /B 0 > a.bat C:\> a.bat && echo yes yes C:\> a.bat || echo yes C:\> echo @EXIT /B 1 > a.bat C:\> a.bat && echo yes yes C:\> a.bat || echo yes
How can I exit from a.bat so that
a.bat && b.bat
anda.bat || b.bat
behave as expected?All commands are run in cmd.exe on Windows XP SP3.
-
jeb over 13 yearsCall has also an effect for this: set var=%%var%%<enter>call call call echo %var%
-
Jordan Evens over 13 yearsAlthough it's a bit weird to use this for exiting, it provides the expected behaviour when other things call the batch so it makes the most sense to use this instead of modifying everything else to use calls.
-
Jordan Evens over 13 yearsI was confused for a bit, so this is just a note for others that you literally need that to be the last line of the file. It won't actually exit the batch, just set the error code. Calling
EXIT /B %ERRORLEVEL%
directly after it doesn't always seem to work either. The only reliable method I found was to useIF ERRORLEVEL 1 goto :end
and have a label:end
just before the last line with%COMSPEC% /C EXIT %ERRORLEVEL%>NUL
-
user66001 over 11 yearsCould this issue be related to a problem I encountered recently?
-
Explorer09 about 7 yearsCALL command was there to address a historical mistake in the DOS ages: the old COMMAND.COM interpreter considers batch file command be launched differently than external programs (.com or .exe). For batch file command, the shell stops the batch file it's running and loads the new batch. (Think of this as similar to
exec foo.sh
in Unix shell - the old script halts and launches new one.) To address the cases where the users/scripts want to continue execution after new script finishes, CALL command was introduced. The peculiar behavior of batch file command remains for compatibility. -
Peter Mortensen almost 6 yearsThe link is broken.
-
phuclv almost 6 years