I have a problem with my batch file. It builds several programs automatically by doing something like this:
So it looks like this:
set FLAG=1
...
gmake all
call :interactive_check
set OTHERFLAG=1
...
gmake all
call :interactive_check
There's 6 or 7 of these (and it might grow). So I made a function to check errorlevel instead of copy/pasting it at every step. The problem is this: the error checking is made through a function:
:interactive_check
if errorlevel 1 (
echo.
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
echo Error in compilation process... exiting
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
echo.
cd %root_dir%
exit /B 1
) ELSE (
echo.Continuing to next step
)
goto:eof
Now, when running it, the exit /B 1
simply exits the function, but not the batch file.
Do you know how to exit the complete batch file without having to copy/paste my "if errorlevel 1.." at every step?
EXIT /B at the end of the batch file will stop execution of a batch file. use EXIT /B < exitcodes > at the end of the batch file to return custom return codes.
Ctrl+C. One of the most universal methods of aborting a batch file, command, or another program while it's running is to press and hold Ctrl + C . This keyboard shortcut sends a SIGINT signal, which cancels or terminates the currently-running program and returns you to the command line.
Use double percent signs ( %% ) to carry out the for command within a batch file. Variables are case sensitive, and they must be represented with an alphabetical value such as %a, %b, or %c. ( <set> ) Required. Specifies one or more files, directories, or text strings, or a range of values on which to run the command.
To close or exit the Windows command line window, also referred to as command or cmd mode or DOS mode, type exit and press Enter .
For a good solution see the part improved version
You can stop a batch at any point, also inside of nested function calls.
You only need to create a syntax error, for example with an empty block ()
, to suppress the error message, it can be executed in a call, and the stderr of the call is redirected to nul.
@echo off
setlocal enabledelayedexpansion
rem Do something
call :interactive_check
rem Do something
call :interactive_check
goto :eof
::::::::::::::::::::::::::
:interactive_check
if errorlevel 1 (
echo.
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
echo Error in compilation process... exiting
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
call :halt 1
) ELSE (
echo.Continuing to next step
)
goto :eof
:: Sets the errorlevel and stops the batch immediately
:halt
call :__SetErrorLevel %1
call :__ErrorExit 2> nul
goto :eof
:__ErrorExit
rem Creates a syntax error, stops immediately
()
goto :eof
:__SetErrorLevel
exit /b %time:~-2%
goto :eof
2017-04-09 Improved version: Exit only the current batch, but not the caller batch
As @dbenham mentioned, there is a new technic for exception handling that can also be used for exiting only the current batch.
@echo off
echo Do something, detecting some fatal error
call :ExitBatch 3
exit /b
:ExitBatch [errorcode] - Exits only the current batch file, regardless how many CALLs
set _errLevel=%1
REM *** Remove all calls from the current batch from the call stack
:popStack
(
(goto) 2>nul
setlocal DisableDelayedExpansion
call set "caller=%%~0"
call set _caller=%%caller:~0,1%%
call set _caller=%%_caller::=%%
if not defined _caller (
REM callType = func
rem set _errLevel=%_errLevel%
goto :popStack
)
(goto) 2>nul
endlocal
cmd /c "exit /b %_errLevel%"
)
echo NEVER REACHED
exit /b
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With