97

Inside a batch file on Windows, I use 7-zip like this:

...\right_path\7z a output_file_name.zip file_to_be_compressed

How could I check the exit code of 7z and take the appropriate action ?

1

4 Answers 4

113

Test for a return code greater than or equal to 1:

if ERRORLEVEL 1 echo Error

or

if %ERRORLEVEL% NEQ 0 echo Error

or test for a return code equal to 0:

if %ERRORLEVEL% EQU 0 echo OK

You can use other commands such as GOTO where I show echo.

10
  • I tried your code. I got the following error: 0 was unexpected this time. Oct 1, 2010 at 5:13
  • 2
    @Misha: You may have tried it with the percent signs the way I originally posted it. Try it without them or try the other versions I added. Oct 1, 2010 at 5:24
  • 2
    Found cases where %ERRORLEVEL% is 0 even though an error occurred. Happened when checking %ERRORLEVEL% in a cmd file. Trying start /wait didn't work. The only thing that worked is if errorlevel 1 (...) Apr 13, 2015 at 12:59
  • 5
    Be aware, errorlevel is not an environment variable. Here's a good summary of the pitfalls and subtleties. Jun 17, 2015 at 6:18
  • 1
    I disagree, it's the perfect place. The question is how to check the exit code of the last command. if the exit code is -1 then we should know about it. Regardless of whether that is an application error code or a system error code, it's still an error code and it should be trapped and handled. I want to know about all errors, so NEQ 0 wins for me every time over GEQ 1... Dec 31, 2019 at 16:10
13

This really works when you have: App1.exe calls -> .bat which runs --> app2.exe

App2 returns errorlevel 1... but you need to catch that in the .bat and re-raise it to app1... otherwise .bat eats the errorlevel and app1 never knows.

Method:

In .bat:

app2.exe
if %ERRORLEVEL% GEQ 1 EXIT /B 1

This is a check after app2 for errorlevel. If > 0, then the .bat exits and sets errorlevel to 1 for the calling app1.

3
  • 6
    it could be even better if you returned the same error back to app1. i didn't try this out, but it should work : if %ERRORLEVEL% GEQ 1 EXIT /B %ERRORLEVEL%.
    – Viktor
    Jul 18, 2014 at 11:24
  • 3
    At least in Windows, %ERRORLEVEL% can be a negative number (e.g. I have a program that returns -1 on errors). IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL% might be a better option. But you really need to know what the program returns on errors. Some programs return certain non-zero codes for special types of success. Nov 13, 2014 at 19:23
  • If app2 is the last thing you run in the bat file, the error code will propagate.
    – AnrDaemon
    Jul 5, 2018 at 11:31
4

I had a batch script in Teamcity pipeline and it did not exit after it's child script did exit with code 1.

To fix the problem I added this string IF %ERRORLEVEL% NEQ 0 EXIT 1 after the child script call.

main-script.bat

...some code
call child-script.bat
IF %ERRORLEVEL% NEQ 0 EXIT 1
...some code

After the child script call exit result is saved to %ERRORLEVEL%. If it did exit with an error %ERRORLEVEL% would not be equal to 0 and in this case we exit with code 1 (error).

1

Try this:

cd.>nul | call Your_7z_File.Bat && Goto :Next || Goto :Error

:: Or...

cd.>nul | ...\right_path\7z.exe a output_file_name.zip file_to_be_compressed && Goto :Next || Goto :Error

1) Set errorlevel == 0

cd.>nul

2) Redirect by | to simultaneously call Your_7z_File.Bat

cd.>nul | call Your_7z_File.Bat

3) Lets the output/errorlevel to a conditional execution && and || filter the next action

cd.>nul | call Your_7z_File.Bat && Goto :Next || Goto :Error

You can also test it in command line adding echo/:

cd.>nul | call Your_7z_File.Bat && echo\Goto :Next || echo\Goto :Error

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.