25

Analogous to the $? in Linux, is there a way to get the exit status of a program in a Windows batch file (.bat)?
Say for example the program has a System.exit(0) upon successful execution, and a System.exit(1) upon a failure, how do I trap these exit values in a .bat file?

Jon Seigel
  • 12,251
  • 8
  • 58
  • 92
pugmarx
  • 7,323
  • 3
  • 30
  • 40

5 Answers5

29

Something like:

java Foo
set exitcode=%ERRORLEVEL%
echo %exitcode%

It's important to make this the absolute next line of the batch file, to avoid the error level being overwritten :)

Note that if you use the

IF ERRORLEVEL number

"feature" of batch files, it means "if the error level is greater than or equal to number" - it's not based on equality. I've been bitten by that before now :)

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • I had a slight problem with this answer ... AFAIK, you can't use space in the set command, so it should be set exitcode=%ERRORLEVEL%. Anyway, making that change worked for me. – Richard Fawcett Apr 24 '12 at 14:44
28

Use %ERRORLEVEL%. Don't you love how batch files are clear and concise? :)

Matthew Flaschen
  • 278,309
  • 50
  • 514
  • 539
20

Raymond Chen has a good blog post named ERRORLEVEL is not %ERRORLEVEL%. Worth checking out.

Also worth noting is that the REM command which most people think of as comments, really aren't. The REM command is a nop command which always succeeds. After a REM, the error level is always 0. So

willalwaysfail.bat
REM unless you insert a comment after it
if errorlevel 1 goto fail

will never fail...

JesperE
  • 63,317
  • 21
  • 138
  • 197
1

mostly answering bulgar's question, but complementing the other answers:

for %ERRORLEVEL% to work you need to have the command extensions activated in Windows (it's the default).
For one session:

cmd /E:on

or permanently in the registry

 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions = 0x01

for more details:

cmd /?

[]]

user85421
  • 28,957
  • 10
  • 64
  • 87
0

Most of the usual external command operations return ERRORLEVEL 0 and this usually (but NOT invariably) indicates that no error was encountered:

c:\> dir
...
c:\> echo %ERRORLEVEL%
dfa
  • 114,442
  • 31
  • 189
  • 228