The Basics of If in Batch
The if command in batch files compares values and branches execution, with the general form if condition (command) else (command). String comparisons use if %VAR%==value, and because batch has no true boolean type, comparisons are done on text unless you add the /i switch for case-insensitive matching. A crucial syntax rule is that the else clause must appear on the same line as the closing parenthesis of the if block, or the interpreter will not recognize it as belonging to that if.
Cricket analogy: Checking whether the third umpire's decision text reads OUT before signalling the batsman off is like if %DECISION%==OUT (echo Batsman is out), a direct string comparison driving what happens next.
@echo off
set /p ANSWER=Continue? (yes/no):
if /i %ANSWER%==yes (
echo Continuing...
) else (
echo Stopping.
exit /b 0
)
Numeric and File-Based Comparisons
For numbers, if supports comparison operators like EQU, NEQ, LSS, LEQ, GTR, and GEQ, as in if %SCORE% GEQ 50 (echo Pass), which correctly handles numeric magnitude instead of string ordering. Batch can also test the filesystem directly: if exist file.txt (...) checks for a file's presence, and if not exist folder\ (...) checks for its absence, both without needing an external command. These file tests are commonly combined with del, copy, or mkdir to build scripts that safely handle missing files or directories.
Cricket analogy: Checking whether a bowler's economy rate is less than or equal to 6 before selecting them for a T20 squad is like if %ECON% LEQ 6 (echo Select bowler), a true numeric comparison rather than text sorting.
File existence checks let a script adapt to its environment without crashing: if exist config.ini (call :LoadConfig) else (call :CreateDefaultConfig) avoids errors from trying to read a file that was never created. Directory checks work the same way, though a trailing backslash such as if exist logs\ (...) is a common convention for checking specifically for a directory rather than a same-named file. Combining if exist with del prevents the classic 'Could not find file' error message that appears when deleting something that is not actually there.
Cricket analogy: Checking whether the ground staff's covers are already out before radioing for them again is like if exist covers_deployed.flag (echo Covers already out) else (echo Deploy covers), avoiding a redundant action.
The /i switch on if makes string comparisons case-insensitive, so if /i %ANSWER%==YES matches yes, Yes, and YES all the same way -- essential when comparing user-typed input.
Errorlevel and Nested Conditions
Every command sets an errorlevel, a numeric exit code where 0 conventionally means success and any nonzero value signals failure; check it with if errorlevel 1 (...), which actually matches any errorlevel greater than or equal to 1, not exactly 1. This is how scripts detect whether a previous command like xcopy or ping succeeded before proceeding. if blocks can be nested inside each other to express multiple conditions, though deeply nested parentheses become hard to read and are often better refactored into labeled subroutines called with call.
Cricket analogy: Checking whether a DRS review actually overturned the on-field call, where any non-zero result means something changed, is like if errorlevel 1 (echo Decision overturned), catching any failure code, not just exactly 1.
if errorlevel 1 matches errorlevel 1 AND anything higher (2, 3, and so on), because it is a threshold test, not an equality test. Use if errorlevel 1 if not errorlevel 2 (...) or if %errorlevel%==1 if you need an exact match.
if %VAR%==value (cmd) else (cmd)is the basic string comparison form;elsemust be on the same line as the closing parenthesis.- Add
/ito make string comparisons case-insensitive, important for user-typed input. - Numeric comparisons use
EQU NEQ LSS LEQ GTR GEQinstead of == to correctly compare magnitude rather than text. if exist file (...)andif not exist file (...)test the filesystem directly without external tools.if errorlevel Nmatches any errorlevel greater than or equal to N, not an exact match.- Every command sets errorlevel automatically; 0 conventionally means success.
- Deeply nested if blocks are hard to read and are often better refactored into labeled subroutines called with
call.
Practice what you learned
1. Why would `if %SCORE%==100` fail to correctly identify the highest score when comparing text like '9' and '100'?
2. What does `if errorlevel 1 (echo Failed)` actually test?
3. Where must the `else` clause be placed relative to an `if` block?
4. What does `if exist logs\ (echo Found)` check for?
5. What does adding `/i` to an if comparison do?
Was this page helpful?
You May Also Like
Variables in Batch Scripts
Learn how Windows batch scripts store, read, and manipulate values using the set command, environment variables, delayed expansion, and substring syntax.
The Choice Command
Use the built-in choice command to build single-keypress menus, timed prompts, and errorlevel-driven branching in Windows batch scripts.
Goto and Labels
Understand how batch scripts use labels and the goto command to jump execution, build subroutines with call, and structure menu-driven scripts.
Related Reading
Related Study Notes in Microsoft Technologies
Browse all study notesWindows 10 / UWP Development Study Notes
.NET · 30 topics
Microsoft TechnologiesMFC (Microsoft Foundation Classes) Study Notes
C++ · 30 topics
Microsoft TechnologiesSilverlight Study Notes
.NET · 30 topics
Microsoft TechnologiesXAML Study Notes
.NET · 30 topics
Microsoft TechnologiesWPF (Windows Presentation Foundation) Study Notes
.NET · 30 topics
Microsoft TechnologiesMVVM Design Pattern Study Notes
.NET · 30 topics