windowsbatch-file

How to to terminate a Windows batch file from within a 'call'ed routine?


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.


Solution

  • 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.