NT Syntax

IF

Conditionally perform a command.

File syntax
IF [NOT] EXIST filename command IF [NOT] EXIST filename (command) ELSE (command) String syntax
IF [/I] [NOT] item1==item2 command IF [/I] item1 compare-op item2 command IF [/I] item1 compare-op item2 (command) ELSE (command) Error Check Syntax IF [NOT] DEFINED variable command IF [NOT] ERRORLEVEL number command IF CMDEXTVERSION number command key item : May be a text string or an environment variable a variable may be modified using either
Substring syntax or Search syntax command : The command to perform NOT : perform the command if the condition is false. == : perform the command if the two strings are equal. /I : Do a case Insensitive string comparison. compare-op : may be one of EQU : equal NEQ : not equal LSS : less than < LEQ : less than or equal <= GTR : greater than > GEQ : greater than or equal >= This 3 digit syntax is necessary because the > and < are recognised as redirection symbols

IF EXIST filename will return true if the file exists (this is not case sensitive).

IF ERRORLEVEL statements should be read as IF Errorlevel > number
i.e.
IF ERRORLEVEL 1 will return TRUE for an errorlevel of 2

Normal completion of a command will return ERRORLEVEL=0

Any test made using the compare-op syntax will always be a "string" comparison,
so when comparing numbers note that "026" > "26"

IF NULL

To test for the existence of a command line paramater - use empty brackets like this

IF [%1] ==[] ECHO Value Missing
or
IF [%1] EQU [] ECHO Value Missing

In the case of a variable that may be NULL - a null variable will remove the variable definition altogether, so testing for NULLs becomes easy:

IF NOT DEFINED v_example ECHO Value Missing

IF DEFINED will return true if the variable contains any value (even if the value is just a space)

BRACKETS

The use of brackets is only required if the command is run over several lines e.g.

IF EXIST filename (
del filename
) ELSE (
echo The file was not found.
)

Do not use brackets or quotes if you are comparing numeric values
e.g.
IF(2) GEQ (15) echo "bigger"
or
IF"2" GEQ "15" echo "bigger"
Will perform a character comparison and will echo "bigger"
however the command
IF2 GEQ 15 echo "bigger"
Will perform a numeric comparison and works as expected - notice that this is opposite to the SET /a command where quotes are required.

CMDEXTVERSION

If Command Extensions are disabled CMDEXTVERSION will return FALSE otherwise it will return "1".
If command extensions are significantly enhanced in a future version of Windows then CMDEXTVERSION will be incremented.

Examples:

IF EXIST C:\install.log (echo Installation complete) ELSE (echo The Installation failed)

IF DEFINED v_department ECHO Got the department variable

IF DEFINED v_commission SET /A v_salary=%v_salary% + %v_commission%

IF CMDEXTVERSION 1 GOTO :start_process

IF ERRORLEVEL EQU 0 goto :okay

:: Capture a specific errorlevel like this
FOR %%G in (0 1 2 3 4 5 6 7 8 9) DO if errorlevel==%%G set v_err=%%G
IF [%v_err%]==[2] echo Errorlevel is 2

:: Wildcards are not supported by IF but you can spoof the same thing using SET:
:: This won't Work
IF %COMPUTERNAME%==ABZ* GOTO :s_matched

:: This will work
SET v_part_name=%COMPUTERNAME:~0,3%
IF NOT %v_part_name%==ABZ GOTO :s_matched

Notes:

When piping commands, the expression is evaluated from left to right, so

IF... | ... is equivalent to (IF ... ) | ...

you can use the explicit syntax IF (... | ...)

Testing ERRORLEVEL correctly

It is possible to create a string variable called %ERRORLEVEL%
if present such a variable will prevent the real ERRORLEVEL from being tested successfully.
Both ECHO %errorlevel% and IF %errorlevel% will respond to a string variable %ERRORLEVEL% in preference to a real ERRORLEVEL.

To test for this problem use SET errorlevel, or IF DEFINED ERRORLEVEL

If you want to deliberately raise an ERRORLEVEL in a batch script use the command "COLOR 00"

If Command Extensions are disabled IF will only support direct comparisons: IF ==, IF EXISTS, IF ERRORLEVEL

You see things; and you say 'Why?' But I dream things that never were; and I say 'why not?' - George Bernard Shaw

Related commands:

Conditional execution syntax (AND / OR)
SET - Display, or Edit Windows NT environment variables
ECHO - Display message on screen
IFMEMBER - NT Workgroup member (Resource kit)
SC - Is a Service running (Resource kit)

Equivalent Linux BASH commands:

case
- Conditionally perform a command
if - Conditionally perform a command
until - Execute commands (until error)
while - Execute commands



Simon Sheppard
SS64.com