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.
- I’ve tried ‘exit’, which closes the entire cmd window. That’s not what I want.
- I’ve tried ‘exit /B 1’. That returns to the previous routine. To use this scheme after every ‘call’ I’d have to carefully write ‘if errorlevel 1 exit /B 1’ after every single ‘call’ to pass the error back up the call stack. I’d prefer not to have to write this line after every call.
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:
which is equivalent to
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:
This, however, will result in the nasty error message
Also, it will take around 2 seconds on my machine.
You can suppress the error message by altering the
callstatement as follows: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
callwould essentially stop the first one. But somehow that doesn’t play well with subroutines. Unrolling the call stack seemingly still takes place.