Exiting batch with `EXIT /B X` where X>=1 acts as if command completed successfully when using && or || operators between batch calls
العربية
български
català
中文
čeština
dansk
Nederlands
eesti
suomi
français
Deutsch
Ελληνικά
עברית
हिंदी
magyar
Bahasa Indonesia
italiano
日本語
한국어
latviešu
lietuvių
norsk
polski
Português
română
русский
slovenčina
slovenski
español
svenska
ไทย
Türkçe
українська
Tiếng Việt
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 that EXIT /B 0 should set ERRORLEVEL=0, which is success, so the && should continue. The counterpoint to this is that calling EXIT /B 1 should set ERRORLEVEL=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
C:\>
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
C:\>
How can I exit from a.bat so that a.bat && b.bat and a.bat || b.bat behave as expected?
All commands are run in cmd.exe on Windows XP SP3.
Answer |
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.