I've got a windows batch file, with a few sub-routines in it something like this:
call :a
goto :eof
:a
call :b
goto :eof
:b
:: How do I directly exit here from here?
goto :eof
I'm running this in a cmd window on Vista.
If I detect an error somewhere in the batch file, I want it to exit with a non-zero errorlevel. Is there anything I can write in the routine :b that will cause the batch file to terminate like this.
This article was interesting, but non of the alternatives behave in the way I want. http://www.computerhope.com/exithlp.htm
Is there another way?
Thanks.
You can call your subroutines like so:
call :b||exit /b 1
which is equivalent to
call :b
if errorlevel 1 exit /b 1
It's slightly shorter and saves you one line, but it's still not ideal, I agree.
Other than that I don't see a way.
EDIT: Ok, I got a way, but it's Pure Evilâ„¢.
Misusing the maximum stack size, and therefore recursion limit, we create another subroutine which simply exhausts the stack by recursively calling itself:
@echo off
echo Calling a
call :a
echo Called a
goto :eof
:a
echo Calling b
call :b
echo Called b
goto :eof
:b
echo Trying to exit
call :exit
goto :eof
:exit
call :exit
This, however, will result in the nasty error message
****** B A T C H R E C U R S I O N exceeds STACK limits ****** Recursion Count=704, Stack Usage=90 percent ****** B A T C H PROCESSING IS A B O R T E D ******
Also, it will take around 2 seconds on my machine.
You can suppress the error message by altering the call
statement as follows:
call :exit >nul 2>&1
which will redirect everything it wants to output into a great void.
But considering the time it takes to fill the stack I think the first variant would be easier.
I was also contemplating using a second batch file, which, when run without call
would essentially stop the first one. But somehow that doesn't play well with subroutines. Unrolling the call stack seemingly still takes place.