- Overview
- Part 1 – Getting Started
- Part 2 – Variables
- Part 3 – Return Codes
- Part 4 – stdin, stdout, stderr
- Part 5 – If/Then Conditionals
- Part 6 – Loops
- Part 7 – Functions
- Part 8 – Parsing Input
- Part 9 – Logging
- Part 10 – Advanced Tricks
Computers are all about 1’s and 0’s, right? So, we need a way to handle when some condition is 1, or else do something different
when it’s 0.
The good news is DOS has pretty decent support for if/then/else conditions.
Checking that a File or Folder Exists
IF EXIST "temp.txt" ECHO found
Or the converse:
IF NOT EXIST "temp.txt" ECHO not found
Both the true condition and the false condition:
IF EXIST "temp.txt" (
ECHO found
) ELSE (
ECHO not found
)
NOTE: It’s a good idea to always quote both operands (sides) of any IF check. This avoids nasty bugs when a variable doesn’t exist, which causes
the the operand to effectively disappear and cause a syntax error.
Checking If A Variable Is Not Set
IF "%var%"=="" (SET var=default value)
Or
IF NOT DEFINED var (SET var=default value)
Checking If a Variable Matches a Text String
SET var=Hello, World!
IF "%var%"=="Hello, World!" (
ECHO found
)
Or with a case insensitive comparison
IF /I "%var%"=="hello, world!" (
ECHO found
)
Artimetic Comparisons
SET /A var=1
IF /I "%var%" EQU "1" ECHO equality with 1
IF /I "%var%" NEQ "0" ECHO inequality with 0
IF /I "%var%" GEQ "1" ECHO greater than or equal to 1
IF /I "%var%" LEQ "1" ECHO less than or equal to 1
Checking a Return Code
IF /I "%ERRORLEVEL%" NEQ "0" (
ECHO execution failed
)
<< Part 4 – stdin, stdout, stderr
Part 6 – Loops >>
If you do a lot of work in Windows batch files, the IF statement offers a very powerful way to add flexibility to your scripts.
In this article, you’re going to learn about five main types of IF statements you can use in a Windows batch file, how the correct syntax looks, and a realistic example for each.
If you’re ready to start scripting, let’s get started.
1. Compare Values
One of the basic things you’ll usually need to do in a batch script is compare two values and follow a different course of action depending on the comparison.
For example, let’s say you want to write a batch script that checks your computer’s hard drive size daily. If it’s below 3GB, you want to get an email report that says «Hard Drive Space Too Low.»
To create a script that compares the current free hard drive space to your limit, you’ll have to create the following batch script and save it as a .bat file.
@echo off
set DriveLimit=300000000
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x
Echo FreeSpace="%FreeSpace%"
Echo Limit="%DriveLimit%"
If %FreeSpace% GTR %DriveLimit% (
Echo There is enough free space.
) else (
Echo Not enough free space.
)
In the script, WMIC is the Windows Management Instrumentation (WMI) component of Windows that comes with an assortment of commands you can use to pull information from your PC.
This is how the «wmic» command in this script calls the logicaldisk space and places it into the FreeSpace variable.
Now you can just replace the line Echo Not enough free space with a command to send you an alert via email. Set the script to run daily.
2. String Comparisons
Another valuable IF comparison you can do in a batch job is comparing strings.
In the following example, you’ll see how to check your Windows version using a batch job. Then you can compare this to your expected Windows version.
Some uses of this script would be for IT audits when you need to quickly run a script and make sure the current operating system is the latest or whether it needs an upgrade.
Here’s what this script looks like:
@echo off
for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j
if "%version%" == "6.0" echo Windows Vista.
if "%version%" == "6.1" echo Windows 7
if "%version%" == "6.2" echo Windows 8
if "%version%" == "6.3" echo Windows 8.1
if "%version%" == "10.0" echo Windows 10.
Here’s what the output of this script looks like:
The ability to compare strings in a batch opens up a whole list of possibilities. If you explore all of the information you can obtain from a WMIC command, you’ll see just how many statistics about your computer you can monitor.
What’s more, you can even use scheduled batch jobs to get alerts on these.
3. Check If a File Exists
Another useful situation where an IF statement in a batch file is to check for the existence of a data file.
A lot of times, the batch job is just a monitoring tool that you can schedule to check for new incoming data files in a specific directory. Then, you can either copy that file over to another location or kick off some Windows script that processes the file into an Excel output.
Using a batch file to check whether a file exists in a directory is quick and easy. Here’s what that script looks like:
@echo off
if exist c:\temp\datafile.txt (
%WINDIR%\SysWOW64\cmd.exe
cscript LoadToExcel.vbs
) else (
rem file doesn't exist
)
The IF EXISTS comparison is useful for a lot of things.
For example, if you have a system or application running that creates new error logs in a specific folder when there’s a problem, you can run a batch job every so often. In this way, you can easily monitor whether new error logs are created so you can send an alert.
4. Check If a Command Failed
An aspect of batch file scripting that too few IT folks or programmers use is checking for errors.
There are a lot of batch jobs floating around out there that are performing critical IT tasks like backing up important files or running file copy operations. When these batch jobs fail, systems fail, and people usually notice.
It’s much smarter to get an alert when your batch job has failed a command before people start noticing. This way, you can fix the issue proactively.
You can do this by utilizing the %errorlevel% variable that most applications and commands return after they are run. All you have to do is follow your command with the IF %ERRORLEVEL% command.
@echo off
xcopy C:\somefolder E:\backupfolder
IF %ERRORLEVEL% NEQ 0 <blat command to send email>
If the application or command returns a zero, all is fine. If not, then you need to send yourself an email.
However, you don’t have to take the email route. You can always write an error log that you might check every morning, or launch a second application or command that attempts to do the copy using an alternate command.
Moreover, if you’d rather use an IF statement to check for specific error codes, Windows offers a pretty extensive list of system error codes.
5. Check for Missing Parameters
The last useful IF statement isn’t for a specific command but instead to check that the script received the appropriate input parameters.
For instance, let’s say you’ve written a script that performs an xcopy command from an input folder to a common network folder used by a team. The user just needs to follow your script name with the parameters defining their personal file path.
You can’t properly execute your script without the path specified, so you may want to put an IF statement at the beginning of your script to make sure both parameters are entered.
@echo off
IF [%1]==[] (
GOTO sub_message
) ELSE (
xcopy %1 E:\backupfolder
)
GOTO eof
:sub_message
echo You forgot to specify your path.
:eof
If you’ve never used parameters with batch scripts before, the percent symbol followed by a number represents the parameter variable. %1 is the first parameter, %2 is the second, and so on.
In general, IF statements are too handy and you don’t need to write too many codes to actually use them. Of course, if you want to step it up a notch, you might consider taking a look at VBA with our guide on creating your first VBA application.
Batch Jobs Can Be Powerful
Many people started using batch jobs for simple tasks that need to be executed sequentially. Thankfully, with IF statements, it’s possible to add far more logic to your scripts.
In addition, you can often use more advanced programming languages and use PowerShell to accomplish many of the same tasks you currently use batch jobs for.
На чтение 5 мин Просмотров 10.7к. Опубликовано
В этой статье мы рассмотрим условный оператор if командной строки (CMD). Как и в любом другом языке программирования, условные оператор служит для проверки заданного условия и в зависимости от результат, выполнять то, или иное действие.
Условный оператор cmd if содержит практически тот же синтаксис, что и аналогичные конструкции языков VBScript (смотри статью “Урок 5 по VBScript: Условный оператор if…else и select…case”) и Jscript (статья “Урок 8 по JScript: Описание условного оператора if…else, арифметических и логических операторов”) сервера сценариев Windows Script Host.
Оператор if командная строка
if условие (оператор1) [else (оператор2)]
Вначале идет проверка условия, если оно выполняется, идет переход к выполнению оператора1, если нет – к оператору2. Если после ключевого слова if прописать not (if not), то: произойдет проверка условия, если оно не выполниться – переход к оператору1, если условие выполняется – переход к оператору2. Использование круглых скобок не является обязательным, но если вам нужно после проверки условия выполнить сразу несколько операторов cmd if, то круглые скобки необходимы.
Давайте откроем редактор notepad++ и пропишем в нем такой код:
@echo off if"%1"=="1"(echo odin) else (echo dva)
Как я уже сказал, мы можем использовать не один оператор (командной строки) cmd if, а несколько, посмотрите на данный пример:
@echo off if"%1"=="1"(hostname & ver & ipconfig /all) else (netstat -a)
Тут, как и прежде идет проверка передаваемого сценарию параметра, если значение равно 1, то произойдет последовательное выполнение трех команд:
- hostname – выводит имя компьютера
- ver – выводит версию ОС
- ipconfig /all – выводит настройки сети
Для последовательного выполнения команд мы использовали знак конкатенации (объединения) “&”. При невыполнении условия произойдет вызов утилиты netstat.
Что бы проверить существование переменной, используются операторы if defined (если переменная существует) и if not defined (если переменная не существует):
@echo off set Var1=100 if defined Var1 (echo%Var1%) set Var1= if not defined Var1 (echo NOT EXIST!!! Var1)
Если вы запустите на выполнение данный код, то в окне командной строки будут выведены две строки:
100
NOT EXIST!!! Var1
Вначале, в сценарии происходит создание переменной Var1 и присвоение ей значения 100, далее идет проверка: если переменная Var1 существует, вывести ее значение. Потом мы удаляем переменную и снова запускаем проверку: если переменная Var1 не существует, вывести строку NOT EXIST!!! Var1.
Мы вправе использовать условный оператор if как вложенный:
@echo off if"%1"=="1"(@if"%2"=="2"(hostname & ver) else (ver)) else (hostname & ver & netstat -a)
В данном примере, первый оператор командной строки if проверяет, равен ли первый аргумент 1, если да, то идет выполнение второго условно оператора и проверка на значение другого аргумента.
Обратите внимание!!! Все переменные определяются как строки. При проверке условия я заключал имена переменных и значений в двойные кавычки, это позволяет избежать ошибок, так как параметры или аргументы могут содержать пробелы, или же у переменной может и вовсе отсутствовать значение.
Давайте теперь посмотрим на такой пример:
@echo off if"%1"=="slovo"(echo slovo) else (@if "%1"=="SLOVO"(echo SLOVO) else (echo NOT DATA!!!))
Тут идет проверка первого аргумента, и регистр строки учитывается, что бы отключить учет регистра при проверке строк, после оператора if нужно прописать ключ /I:
@echo off if/I "%1"=="slovo"(echo slovo) else (if/I "%1"=="SLOVO"(echo SLOVO) else (echo NOT DATA!!!))
В данном случае, передадим мы строку SLOVO, slovo, SloVo и так далее, все ровно на экран консоли выведется строка “slovo”, так как учет регистра знаков будет отключен.
Оператор if командная строка, операторы сравнения
Кроме оператора сравнения “==” можно использовать и другие операторы для проверки условия:
- equ «Равно». Дает True, если значения равны
- neq «Не равно». Дает True, если значения не равны
- lss «Меньше». Дает True, если зпачение1 меньше, чем значение2
- lcq «Меньше или равно». Дает True, если значепие1 равно или меньше, чемзначение2
- gtr «Больше». Дает True, если значение1 больше, чем значение2
- geq «Больше или равно». Дает True, если значепие1 равно или больше, чем значение2
В этой статье мы рассмотрели условный оператор командной строки if.
- SS64
- CMD
- How-to
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] [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 A text string or environment variable, for more complex comparisons, a variable can be modified using either Substring or Search syntax. command The command to perform. filename A file to test or a wildcard pattern. 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 Can 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 used because the > and < symbols are recognised as redirection operators
IF will only parse numbers when one of (EQU, NEQ, LSS, LEQ, GTR, GEQ) is used.
The == comparison operator always results in a string comparison.
Compare strings that contain Spaces by using «double quotes»
The IF command can seem flaky if any spaces exist in the comparison strings. for example these commands all seem like they work:
IF ‘ab’ == ‘a b’ Echo OK
IF [ab] == [a b] Echo OKBut if you reverse the logic to see if they are not equal, the code will fail and thow an error:
IF ‘ab’ NEQ ‘a b’ Echo OK
IF [ab] NEQ [a b] Echo OKSimilarly this will fail:
IF ‘a b’ == ‘a b’ Echo OK
The problem with the above, is that single quotes have no special meaning to CMD, so when it reaches a space it assumes that’s the end of the string.
These versions using double quotes will all work:
IF «ab» == «a b» Echo OK
IF «ab» NEQ «a b» Echo OK
IF NOT «ab» == «a b»So then you think, OK I’ll just use double quotes. However there is one remaining gotcha, if the item you are comparing is a quoted filename, so it already contains double quotes, you have an escape sequence:
IF «»long filename»» EQU «something» Echo OK
That will break because the «» acts as an escape. To prevent that from happening strip any quotes from the strings being compared.
In addition to spaces, the above applies to all other delimiters [Comma],[Semicolon], [Equals], [Space] [Tab].
Either the delimiters must be individually escaped with a caret ^ or the whole string must be «quoted».
Test if a variable is empty
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 MissingWhen comparing against a variable that may be empty, we include a pair of brackets [ ] so that if the variable does happen to be empty the IF command still has something to compare: IF [] EQU [] will return True.
You can in fact use almost any character for this a ‘~’ or curly brackets, { } or even the number 4, but square brackets tend to be chosen because they don’t have any special meaning.
When working with filenames/paths you should always surround them with quotes, if %_myvar% contains «C:\Some Path» then your comparison becomes IF [«C:\Some Path»] EQU []
if %_myvar% could contain empty quotes, «» then your comparison should become IF [%_myvar%] EQU [«»]if %_myvar% will never contain quotes, then you can use quotes in place of the brackets IF «%_myvar%» EQU «»
However with this pattern if %_myvar% does unexpectedly contain quotes, you will get IF «»C:\Some Path»» EQU «» those doubled quotes, act as an escape and will break the comparison.
Test if a variable is NULL
In the case of a variable that might be NULL — a null variable will remove the variable definition altogether, so testing for a NULL becomes:
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).
To test for the existence of a variable use SET VariableName, or IF DEFINED VariableName
Test the existence of files and folders
IF EXIST filename Will detect the existence of a file or a folder.
The script empty.cmd will show if the folder is empty or not (this is not case sensitive).
Parenthesis
Parenthesis can be used to split commands across multiple lines. This enables writing more complex IF… ELSE… commands:
IF EXIST filename.txt ( Echo deleting filename.txt Del filename.txt ) ELSE ( Echo The file was not found. )When combining an ELSE statement with parentheses, always put the opening parenthesis on the same line as ELSE.
) ELSE ( This is because CMD does a rather primitive one-line-at-a-time parsing of the command.When using parentheses 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.
Pipes
When piping commands, the expression is evaluated from left to right, so
IF SomeCondition Command1 | Command2 is equivalent to:
(IF SomeCondition Command1 ) | Command2
The pipe is always created and Command2 is always run, regardless whether SomeCondition is TRUE or FALSEYou can use brackets and conditionals around the command with this syntax:
IF SomeCondition (Command1 | Command2)
If the condition is met then Command1 will run, and its output will be piped to Command2.The IF command will interpret brackets around a condition as just another character to compare (like # or @) for example:
IF (%_var1% == (demo Echo the variable _var1 contains the text demoPlacing an IF command on the right hand side of a pipe is also possible but the CMD shell is buggy in this area and can swallow one of the delimiter characters causing unexpected results.
Chaining IF commands (AND).
The only logical operator directly supported by IF is NOT, so to perform an AND requires chaining multiple IF statements:
IF SomeCondition ( IF SomeOtherCondition ( Command_if_both_are_true ) )
If either condition is true (OR)
This can be tested using a temporary variable:
Set «_tempvar=»
If SomeCondition Set «_tempvar=1»
If SomeOtherCondition Set «_tempvar=1»
if %_tempvar% EQU 1 Command_to_run_if_either_is_true
Test Numeric values
IF only parses numbers when one of the compare-op operators (EQU, NEQ, LSS, LEQ, GTR, GEQ) is used.
The == comparison operator always results in a string comparison.This is an important difference because if you compare numbers as strings it can lead to unexpected results: «2» will be greater than «19» and «026» will be less than «10».
Correct numeric comparison:
IF 2 GEQ 15 echo «bigger»Using parentheses or quotes will force a string comparison:
IF (2) GEQ (15) echo «bigger»
IF «2» GEQ «15» echo «bigger»This behaviour is exactly opposite to the SET /a command where quotes are required.
IF should work within the full range of 32 bit signed integer numbers (-2,147,483,648 through 2,147,483,647)
C:\> if 2147483646 GEQ 2147483647 (Echo Larger) Else (Echo Smaller)
Smaller ⇨ correctC:\> if 2147483647 GEQ 2147483648 (Echo Larger) Else (Echo Smaller)
Larger ⇨ wrong due to overflowC:\> if -2147483649 GEQ -2147483648 (Echo Larger) Else (Echo Smaller)
Larger ⇨ wrong due to overflowYou can perform a string comparison on very long numbers, but this will only work as expected when the numbers are exactly the same length:
C:\> if «2147483647» GEQ «2147483648» (Echo Larger) Else (Echo Smaller)
Smaller ⇨ correct
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
ERRORLEVEL
There are two different methods of checking an errorlevel, the first syntax ( IF ERRORLEVEL … ) provides compatibility with ancient batch files from the days of Windows 95.
The second method is to use the %ERRORLEVEL% variable available in Windows 2000 or newer.IF ERRORLEVEL n statements should be read as IF Errorlevel >= number
i.e.
IF ERRORLEVEL 0 will return TRUE whether the errorlevel is 0, 1 or 5 or 64
IF ERRORLEVEL 1 will return TRUE whether the errorlevel is 1 or 5 or 64
IF NOT ERRORLEVEL 1 means if ERRORLEVEL is less than 1 (Zero or negative).
This is not very readable or user friendly and does not easily account for negative error numbers.Using the %ERRORLEVEL% variable is a more logical method of checking Errorlevels:
IF %ERRORLEVEL% NEQ 0 Echo An error was found
IF %ERRORLEVEL% EQU 0 Echo No error foundIF %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 foundThis allows you to trap errors that can be negative numbers, you can also test for specific errors:
IF %ERRORLEVEL% EQU 64 …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 override and prevent the system variable %ERRORLEVEL% from being read by commands such as ECHO and IF.
If Command Extensions are disabled IF will only support direct comparisons: IF ==, IF EXIST, IF ERRORLEVEL
also the system variable CMDEXTVERSION will be disabled.
In early versions of Windows NT/XP comparisons made using == would include the spaces before and after the ==, so for backwards compatibility you may still see commands written as IF alpha==beta rather than IF alpha == beta
IF does not, by itself, set or clear the Errorlevel.
IF is an internal command.
Examples
Does a specific file exist:
IF EXIST C:\logs\install.log (Echo Complete) ELSE (Echo failed)
Does any file exist:
IF EXIST C:\logs\*.log (Echo Log file exists)
Does a variable exist:
IF DEFINED _department ECHO This is for %_department%.
IF DEFINED _commission SET /A «_salary=%_salary% + %_commission%»
Do we have Command Processor Extensions set?
IF CMDEXTVERSION 2 GOTO start_process
Does an error exist:
IF %ERRORLEVEL% EQU 2 goto sub_problem2
You see things; and you say ‘Why?’ But I dream things that never were; and I say ‘why not?’ ~ George Bernard Shaw
Related commands
Using parentheses to group and expand expressions.
Conditional execution syntax (AND / OR)
SET — Display or Edit environment variables.
ECHO — Display message on screen.
EXIT — Set a specific ERRORLEVEL.
IFMEMBER — group member (Resource kit).
SC — Is a Service running (Resource kit).
Equivalent PowerShell: IF — Conditionally perform a command.
Equivalent bash command (Linux):
if — Conditionally perform a command.
Copyright © 1999-2025 SS64.com
Some rights reserved