Windows batch файл if
Обработка условий в пакетных программах.
Синтаксис
Если расширения командного процессора разрешены, следует использовать следующий синтаксис:
Параметры
not Задает выполнение команды только в случае невыполнения условия. errorlevel число Условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа. команда Команда, которая должна быть обработана в случае выполнения условия. строка1==строка2 Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки. exist имя_файла Условие выполняется, если существует файл с именем имя_файла. оп_сравнения Трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.
Оператор | Описание |
---|---|
EQU | равно |
NEQ | не равно |
LSS | меньше |
LEQ | меньше или равно |
GTR | больше |
GEQ | больше или равно |
/i Сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел. cmdextversion число Условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены). defined переменная Условие выполняется, если переменная определена. выражение Команда и все ее параметры для обработке в командной строке при выполнении оператора else. /? Отображение справки в командной строке.
Заметки
- Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
- Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
- Использование команды definedпеременная
При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.
%errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:
goto answer%errorlevel%
:answer0
echo Код возврата программы равен 0
:answer1
echo Код возврата программы равен 1
goto end
:end
echo Готово!
Операторы сравнения оп_сравнения также можно использовать следующим образом:
%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.
%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.
Использование оператора else
Оператор else должен размещаться в той же строке, что и команда if. Пример:
Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:
IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствует
Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:
Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:
IF EXIST имя_файла (del имя_файла) ELSE echo имя_файла отсутствует
Примеры
Если файл Product.dat не удается найти, появится следующее сообщение:
if not exist product.dat echo Не найден файл данных
Если в приведенном ниже примере при форматировании диска в дисководе A возникнет ошибка, будет выведено сообщение об ошибке:
:begin
@echo off
format a: /s
if not errorlevel 1 goto end
echo Ошибка при форматировании.
:end
echo Конец пакетной программы.
Если ошибка не возникнет, сообщение об ошибке выведено не будет.
Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:
If statement in Windows Batch file
I have been stuck on this silly if statement, whatever i do, I cannot get the if statment to go to the correct label.
- Hitting ‘y’ works, cmd-prompt stops at START DEPLOY
- BUT, if I type ‘n’ cmd prints START DEPLOY then goes to end, instead of going direct to the cancel label.
5 Answers 5
If we ignore the fact that required input was y. or n. (due to the . in the if comparison), nobody noticed the ACTUAL problem with c14kaa’s script (except Nick DeVore but didn’t say why). The original script had the line
set /p confirmDeploy =Confirm deployment of code [y/n] ?:
Nick mentioned that this did not put the response into the variable. That is because it was putting the response into «confirmDeploy » (the space is part of the variable name, just another foible of cmd’s input parsing). Thus when c14kaa used %confirmDeploy%, it would have expanded to %confirmDeploy% (i.e. been taken literally) unless that variable had been set elsewhere. I can only assume that c14kaa had turned off echoing because the fact that confirmDeploy did not substitute (or contained something other than y or n) would have been a big clue. It would have also revealed the problem with the . in the if statement.
As for the other suggestions, having «» around the variable (and hence needed in the matching string) is preferred to stop syntax errors when the variable is blank (generating the statement ‘if == y’, what jeb means by «failing»), the : before the label name in the goto is ignored and there needs to be a space after the /I in John’s version (even though the if command has only one option, some commands have many and they can be put together such as in «findstr /ivn . » so the space marks the end of the list).
The only other comment I would make is that c14kaa assumes that the user will always enter the correct response (y or n) because otherwise the script will «fall through» into the :deployCode section (probably not the ideal default behaviour). This explains the response obtained to the suggestion by Matt (echo bad input). Since the response was being put into confirmDeploy it meant that both tests (using confirmDeploy without the space) failed.
Taking all of the above leaves us with Reny’s version (with some explanation added).
Windows batch файл if
Обработка условий в пакетных программах
Синтаксис
Если расширения командного процессора разрешены, следует использовать следующий синтаксис:
Параметры
not Задает выполнение команды только в случае невыполнения условия. errorlevelчисло Условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа. команда Команда, которая должна быть обработана в случае выполнения условия. строка1==строка2 Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки. existимя_файла Условие выполняется, если существует файл с именем имя_файла. оп_сравнения Трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.
Оператор | Описание |
---|---|
EQU | равно |
NEQ | не равно |
LSS | меньше |
LEQ | меньше или равно |
GTR | больше |
GEQ | больше или равно |
/i Сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел. cmdextversion число Условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены). defined переменная Условие выполняется, если переменная определена. выражение Команда и все ее параметры для обработке в командной строке при выполнении оператора else. /? Отображение справки в командной строке.
Заметки
- Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
- Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
- Использование команды definedпеременная
При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.
%errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:
Операторы сравнения оп_сравнения также можно использовать следующим образом:
%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.
%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.
Использование оператора else
Оператор else должен размещаться в той же строке, что и команда if. Пример:
Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:
Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:
Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:
Примеры
Если файл Product.dat не удается найти, появится следующее сообщение:
Если в приведенном ниже примере при форматировании диска в дисководе A возникнет ошибка, будет выведено сообщение об ошибке:
Если ошибка не возникнет, сообщение об ошибке выведено не будет.
Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
How to use if — else structure in a batch file?
I have a question about if — else structure in a batch file. Each command runs individually, but I couldn’t use «if — else» blocks safely so these parts of my programme doesn’t work. How can I do make these parts run? Thank you.
8 Answers 8
Your syntax is incorrect. You can’t use ELSE IF . It appears that you don’t really need it anyway. Simply use multiple IF statements:
I think in the question and in some of the answers there is a bit of confusion about the meaning of this pseudocode in DOS: IF A IF B X ELSE Y. It does not mean IF(A and B) THEN X ELSE Y, but in fact means IF A( IF B THEN X ELSE Y). If the test of A fails, then he whole of the inner if-else will be ignored.
As one of the answers mentioned, in this case only one of the tests can succeed so the ‘else’ is not needed, but of course that only works in this example, it isn’t a general solution for doing if-else.
There are lots of ways around this. Here is a few ideas, all are quite ugly but hey, this is (or at least was) DOS!
AFAIK you can’t do an if else in batch like you can in other languages, it has to be nested if ‘s.
Using nested if ‘s your batch would look like
or as James suggested, chain your if ‘s, however I think the proper syntax is
I believe you can use something such as
A little bit late and perhaps still good for complex if-conditions, because I would like to add a «done» parameter to keep a if-then-else structure:
IF. ELSE IF constructs work very well in batch files, in particular when you use only one conditional expression on each IF line:
In your example you use IF. AND. IF type construct, where 2 conditions must be met simultaneously. In this case you can still use IF. ELSE IF construct, but with extra parentheses to avoid uncertainty for the next ELSE condition:
If statement in Windows Batch file
I have been stuck on this silly if statement, whatever i do, I cannot get the if statment to go to the correct label.
- Hitting ‘y’ works, cmd-prompt stops at START DEPLOY
- BUT, if I type ‘n’ cmd prints START DEPLOY then goes to end, instead of going direct to the cancel label.
5 Answers 5
If we ignore the fact that required input was y. or n. (due to the . in the if comparison), nobody noticed the ACTUAL problem with c14kaa’s script (except Nick DeVore but didn’t say why). The original script had the line
set /p confirmDeploy =Confirm deployment of code [y/n] ?:
Nick mentioned that this did not put the response into the variable. That is because it was putting the response into «confirmDeploy » (the space is part of the variable name, just another foible of cmd’s input parsing). Thus when c14kaa used %confirmDeploy%, it would have expanded to %confirmDeploy% (i.e. been taken literally) unless that variable had been set elsewhere. I can only assume that c14kaa had turned off echoing because the fact that confirmDeploy did not substitute (or contained something other than y or n) would have been a big clue. It would have also revealed the problem with the . in the if statement.
As for the other suggestions, having «» around the variable (and hence needed in the matching string) is preferred to stop syntax errors when the variable is blank (generating the statement ‘if == y’, what jeb means by «failing»), the : before the label name in the goto is ignored and there needs to be a space after the /I in John’s version (even though the if command has only one option, some commands have many and they can be put together such as in «findstr /ivn . » so the space marks the end of the list).
The only other comment I would make is that c14kaa assumes that the user will always enter the correct response (y or n) because otherwise the script will «fall through» into the :deployCode section (probably not the ideal default behaviour). This explains the response obtained to the suggestion by Matt (echo bad input). Since the response was being put into confirmDeploy it meant that both tests (using confirmDeploy without the space) failed.
Taking all of the above leaves us with Reny’s version (with some explanation added).