http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx
The command interpreter cmd.exe
has a concept known as the error level, which is the exit code of the program most recently run. You can test the error level with the IF ERRORLEVEL
command:
IF ERRORLEVEL 1 ECHO error level is 1 or more
<sidebar>
The IF ERRORLEVEL n
test succeeds if the error level is n or more. This was presumably because there were programs that expressed different degrees of failure with higher and higher exit codes. For example, the diff
program has three exit codes: 0 means the files are the same; 1 means the files are different; 2 means that something terrible happened. There are also programs that use an exit code of zero to mean success and anything else to mean failure.
</sidebar>
In addition to this internal state, you can, if you wish, create an environment variable with the name ERRORLEVEL
, in the same way that you can create an environment variable called FRED
. But, as with FRED
, that variable won't have any effect on the error level.
rem this next command sets the error level to zero CMD /C EXIT 0 set ERRORLEVEL=1 if ERRORLEVEL 1 echo Does this print?
The message is not printed because the ERRORLEVEL
environment variable has no effect on the error level. It's just a variable whose name happens to coincide with a command processor concept.
set BANKBALANCE=$1,000,000.00
"Hey, when I tried to withdraw the money, I got an insufficient funds error. What am I doing wrong?"
Now, it does happen to be the case that if command extensions are enabled and you say %ERRORLEVEL%
, then the command processor first looks for an environment variable called ERRORLEVEL
, and if it can't find one, then it replaces %ERRORLEVEL%
with the current value of the internal error level value. It's a fallback step, in the same way that your neighbor is a fallback delivery location if you aren't home. If you file a change-of-address form for yourself, that doesn't affect packages sent to your neighbor.
The same behavior can be seen with %CD%
: If you did not explicitly set an environment variable called CD
, then %CD%
expands to the command processor's current directory. But you can't change directories by saying set CD=C:\Windows
.
I can think of a few reasons why this feature may have been added.
ECHO error level is %ERRORLEVEL%>logfile
IF %ERRORLEVEL% EQU 1 echo Different!
But I'm digressing. My point for today is that the error level is not the same as the ERRORLEVEL
environment variable.