100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Batch

If/Else in Batch

Master conditional logic in Windows batch files: comparing strings and numbers, testing file existence, checking errorlevel, and chaining else branches.

Variables and Control FlowBeginner9 min readJul 10, 2026
Analogies

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.

batch
@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; else must be on the same line as the closing parenthesis.
  • Add /i to make string comparisons case-insensitive, important for user-typed input.
  • Numeric comparisons use EQU NEQ LSS LEQ GTR GEQ instead of == to correctly compare magnitude rather than text.
  • if exist file (...) and if not exist file (...) test the filesystem directly without external tools.
  • if errorlevel N matches 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

Was this page helpful?

Topics covered

#Batch#WindowsBatchScriptingStudyNotes#MicrosoftTechnologies#IfElseInBatch#Else#Numeric#File#Based#StudyNotes#SkillVeris