Sean's Personal Code Samples And References
Conditional Execution

Syntax

if command1 succeeds then execute command2 (IF)

command1 && command2

Execute command1 and then execute command2 (AND)

command1 & command2

Execute command2 only if command1 fails (OR)

command1 || command2

Care must be taken in using this syntax to read and SET variables as by default variables are expanded one line at a time.

Success is defined as returning an %errorlevel% = 0

Example

   COPY H:\share\TNSnames.ora C:\Oracle\ || ECHO The Copy Failed

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 <
                symbols are recognised as redirection operators
IF ERRORLEVEL n statements should be read as IF Errorlevel >= number
i.e.
IF ERRORLEVEL 0 will return TRUE when the errorlevel is 64

An alternative and often better method of checking Errorlevels is to use the string syntax along with the %ERRORLEVEL% variable:

IF %ERRORLEVEL% GTR 0 Echo An error was found
IF %ERRORLEVEL% LSS 0 Echo An error was found

IF %ERRORLEVEL% EQU 0 Echo No error found
IF %ERRORLEVEL% EQU 0 (Echo No error found) ELSE (Echo An error was found)
IF %ERRORLEVEL% EQU 0 Echo No error found || Echo An error was found

Note some errors are negative numbers.
When working with errorlevels in a batch file it's a good idea to also use SETLOCAL so that the %ERRORLEVEL% variable is reset each time the batch file runs.

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

Examples:

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

IF DEFINED _department ECHO Got the department variable

IF DEFINED _commission SET /A _salary=%_salary% + %_commission% 

IF CMDEXTVERSION 1 GOTO start_process

IF %ERRORLEVEL% EQU 2 goto sub_problem2
Does %1 exist?

To test for the existence of a command line parameter - 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 _example ECHO Value Missing

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

Test the existence of files and folders

IF EXIST name - will detect the existence of a file or a folder - the script empty.cmd will show if the folder is empty or not.

Brackets

You can improve the readability of a batch script by writing a complex IF...ELSE command over several lines using brackets 
e.g.

IF EXIST filename (
    Del filename
 ) ELSE ( 
    Echo The file was not found.
 )
When using brackets the CMD shell will expand [read] all the variables at the beginning of the code block and use those values even if the variables value has just been changed. Turning on DelayedExpansion will force the shell to read variables at the start of every line.

Delimiters

If the string being compared by an IF command includes delimiters such as [Space] or [Comma], then either the delimiters must be escaped with a caret ^ or the whole string must be "quoted".
This is so that the IF statement will treat the string as a single item and not as several separate strings.

Testing Numeric values

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

The examples here all use GEQ, but this applies equally to all the compare-op operators: EQU, NEQ, LSS, LEQ, GTR, GEQ 
when comparing numbers as a string "026" > "26"

Wildcards

Wildcards are not supported by IF, so %COMPUTERNAME%==SS6* will not match SS64 

A workaround is to retrieve the substring and compare just those characters: 
SET _prefix=%COMPUTERNAME:~0,3% 
IF %_prefix%==SS6 GOTO they_matched

Pipes

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

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

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

ERRORLEVEL

To deliberately raise an ERRORLEVEL in a batch script use the EXIT /B command.

It is possible (though not a good idea) to create a string variable called %ERRORLEVEL% (user variable)
if present such a variable will prevent the real ERRORLEVEL (a system variable) from being used by commands such as ECHO and IF.

To test for the existence of a user variable use SET errorlevel, or IF DEFINED ERRORLEVEL

If Command Extensions are disabled IF will only support direct comparisons: IF ==, IF EXIST, IF ERRORLEVEL 
also the system variable CMDEXTVERSION will be disabled.
Sean Marcellus
There are 10 kinds of people e in this world, those who understand binary and those who don’t.