Else if bat: if statement — Batch — If, ElseIf, Else
Содержание
bat if · GitHub
Оператор условного выполнения команд в пакетном файле. | |
IF [NOT] ERRORLEVEL число команда | |
IF [NOT] строка1==строка2 команда | |
IF [NOT] EXIST имя_файла команда | |
NOT Обращает истинность условия: истинное условие | |
становится ложным, а ложное — истинным. | |
ERRORLEVEL число Условие является истинным, если код возврата последней | |
выполненной программы не меньше указанного числа.![]() | |
строка1==строка2 Это условие является истинным, если указанные строки | |
совпадают. | |
EXIST имя_файла Это условие является истинным, если файл с указанным | |
именем существует. | |
команда Задает команду, выполняемую при истинности условия. | |
За этой командой может следовать ключевое слово ELSE, | |
служащее для указания команды, которая должна | |
выполняться в том случае, если условие ложно.![]() | |
Предложение ELSE должно располагаться в той же строке, что и команда, | |
следующая за ключевым словом IF. Например: | |
IF EXIST имя_файла. ( | |
del имя_файла. | |
) ELSE ( | |
echo имя_файла. missing. | |
) | |
Следующий пример содержит ОШИБКУ, поскольку команда del должна | |
заканчиваться переходом на новую строку: | |
IF EXIST имя_файла.![]() | |
Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна | |
Располагаться в той же строке, что и команда, следующая за IF: | |
IF EXIST имя_файла. del имя_файла. | |
ELSE echo имя_файла. missing | |
Вот правильный пример, где все команды расположены в одной строке: | |
IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла.![]() | |
Изменение команды IF при включении расширенной обработки команд: | |
IF [/I] строка1 оператор_сравнения строка2 команда | |
IF CMDEXTVERSION число команда | |
IF DEFINED переменная команда | |
где оператор_сравнения принимает следующие значения: | |
EQU — равно | |
NEQ — не равно | |
LSS — меньше | |
LEQ — меньше или равно | |
GTR — больше | |
GEQ — больше или равно | |
а ключ /I, если он указан, задает сравнение текстовых строк без учета | |
регистра.![]() | |
команды IF. Сравнения проводятся по общему типу данных, так что если | |
строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, | |
после чего выполняется сравнение чисел. | |
Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение | |
сравнивается с внутренним номером версии текущей реализации расширенной | |
обработки команд. Первая версия имеет номер 1. Номер версии будет | |
увеличиваться на единицу при каждом добавлении существенных возможностей | |
расширенной обработки команд.![]() | |
условие CMDEXTVERSION никогда не бывает истинно. | |
Условие DEFINED применяется подобно условию EXISTS, но принимает в качестве | |
аргумента имя переменной среды и возвращает истинное значение, если эта | |
переменная определена. | |
Строка %ERRORLEVEL% будет развернута в строковое представление текущего | |
значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется | |
переменная среды с именем ERRORLEVEL; в подобном случае подставляется | |
значение этой переменной.![]() | |
следующее: | |
goto answer%ERRORLEVEL% | |
:answer0 | |
echo Получен код возврата 0 | |
:answer1 | |
echo Получен код возврата 1 | |
Допускается и применение описанных выше операторов числового сравнения: | |
IF %ERRORLEVEL% LEQ 1 goto okay | |
Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную | |
CMD.![]() | |
переменная среды с именем CMDCMDLINE, в подобном случае подставляется | |
значение этой переменной. | |
Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой | |
текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется | |
переменная среды с именем CMDEXTVERSION; в подобном случае подставляется | |
значение этой переменной. |
Cmd if else примеры — Dudom
Формат командной строки:
IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда
NOT — Указывает, что Windows должна выполнить эту команду, только если условие является ложным.
ERRORLEVEL число — Условие является истинным, если код возврата последней выполненной программы не меньше указанного числа.
строка1==строка2 — Условие является истинным, если указанные строки совпадают.
EXIST имя_файла — Условие является истинным, если файл с указанным именем существует.
команда — Задает команду, выполняемую при истинности условия. За этой командой может следовать ключевое слово ELSE. В случае, если указанное условие ложно, будет выполнена команда, находящаяся после слова ELSE.
Предложение ELSE должно располагаться в той же строке, что и команда, следующая за ключевым словом IF. Например:
IF EXIST имя_файла. (
del имя_файла.
) ELSE (
echo имя_файла. missing.
)
Следующий пример содержит ОШИБКУ, поскольку команда del должна заканчиваться переходом на новую строку:
IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. Missing
Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна располагаться в той же строке, что и команда, следующая за IF:
IF EXIST имя_файла. del имя_файла.
ELSE echo имя_файла. missing
Вот правильный пример, где все команды расположены в одной строке:
IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. Missing
Изменение команды IF при включении расширенной обработки команд:
IF [/I] строка1 оператор_сравнения строка2 команда
IF CMDEXTVERSION число команда
IF DEFINED переменная команда
где оператор_сравнения принимает следующие значения:
EQU — равно
NEQ — не равно
LSS — меньше
LEQ — меньше или равно
GTR — больше
GEQ — больше или равно,
а ключ /I , если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется сравнение чисел.
Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение сравнивается с внутренним номером версии текущей реализации расширенной обработки команд. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.
Условие DEFINED применяется подобно условию EXIST , но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена.
Строка %ERRORLEVEL% будет развернута в строковое представление текущего значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется переменная среды с именем ERRORLEVEL; в подобном случае подставляется значение этой переменной. Например, с помощью данной строки можно выполнить следующее:
goto answer%ERRORLEVEL%
:answer0
echo Получен код возврата 0
:answer1
echo Получен код возврата 1
Допускается и применение описанных выше операторов числового сравнения:
IF %ERRORLEVEL% LEQ 1 goto okay
Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную CMD. EXE до любой обработки, за исключением ситуации, когда уже определена переменная среды с именем CMDCMDLINE; в подобном случае подставляется значение этой переменной.
Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется переменная среды с именем CMDEXTVERSION; в подобном случае подставляется значение этой переменной.
Создание пустого файла, имя которого задается параметром командной строки.
Если параметр командной строки не задан, то пользователю выдается сообщение об ошибке.
@echo off
REM Проверить наличие имени файла, задаваемого в качестве параметра %1
REM Если параметр %1 пустой – переход на метку error
if «%1» EQU «» goto error
REM Если параметр задан, создаем пустой файл, копированием из устройства nul
copy nul «%1»
exit
:error
ECHO File name required ! Must be — %
n0 filename.ext
:exit
Командный файл, выполняющий опрос командой ping сетевых адресов в заданном диапазоне ( 192. 168.1.1 – 192.168.1.254 ). Команда ping формирует значение переменной ERRORLEVEL равное нулю, если верно заданы параметры командной строки. То есть, определить доступность пингуемого IP-адреса методом анализа кода возврата ping не получится, поскольку он будет нулевым, независимо от того, отвечает ли пингуемое устройство, или нет. Поэтому, для решения данной задачи необходимо определить характерный признак, который присутствует в выводимых результатах только в том случае, когда пингуемое устройство доступно. Таким признаком может быть наличие строки символов «TTL» в выводе команды ping. Для определения признака можно использовать команду find в цепочке с командой ping .
Примеры вывода для отвечающего и не отвечающего узлов:
Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64 — если устройство с данным IP-адресом доступно;
Превышен интервал ожидания для запроса. — если устройство не отвечает;
Команда find /I «TTL» возвращает код ERRORLEVEL равный 0 , если строка «TTL» присутствует в результате выполнения ping . Ключ /I имеет смысл использовать, чтобы результат не зависил от того, строчные или заглавные символы составляют строку «ttl».
Результат работы командного файла записывается в текстовый файл iplist.txt
@ECHO OFF
REM Постоянная часть IP-адреса
set IPTMP=192.168.1.
REM Количество пингуемых узлов
set N=254
rem С какого адреса начать — начальное значение » хвоста » IP- адреса X.X.X.IPMIN
set /A IPMIN=1
ECHO %DATE% Опрос пингом %N% адресов начиная с %IPTMP%%IPMIN% >> iplist.txt
rem M0 — метка для организации цикла
:M0
rem Переменная IPFULL — полное значение текущего IP-адреса
set IPFULL=%IPTMP%%IPMIN%
rem Если » хвост «больше N – перейти к завершению работы
IF %IPMIN% GTR %N% GOTO ENDJOB
ping -n 1 %IPFULL% | find /I «TTL»
if %ERRORLEVEL%==0 Echo %IPFULL% >> iplist.txt
rem Сформируем следующий IP-адрес
set /A IPMIN=%IPMIN% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit
Существуют некоторые особенности реализации командного интерпретатора CMD. EXE , которые необходимо учитывать при обработке значений переменных внутри циклов IF и FOR . Использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON , что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака ( ! ) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF . Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:
После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки:
FOR … (
IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0
…
)
    В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию — вместо оператора EQU — равно , указано EQL — равно
Обработка условий в пакетных программах
Синтаксис
Если расширения командного процессора разрешены, следует использовать следующий синтаксис:
Параметры
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). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Conditionally perform a command.
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.
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 providing compatibility with 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 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
This 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 prevent the real ERRORLEVEL (a system variable) from being used by commands such as ECHO and IF.
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 Missing
When 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, while not officially documented as an escape will still mess up 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 user 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:
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 FALSE
You 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 demo
Placing 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.
A simple example that does work:
Echo Y | IF red==blue del *.log
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 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
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.
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.
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
If Command Extensions are disabled IF will only support direct comparisons: IF ==, IF EXIST, IF ERRORLEVEL
also the system variable CMDEXTVERSION will be disabled.
IF does not, by itself, set or clear the Errorlevel.
IF is an internal command.
You see things; and you say ‘Why?’ But I dream things that never were; and I say ‘why not?’
George Bernard Shaw
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).
Powershell: if — Conditionally perform a command.
Equivalent bash command (Linux): if — Conditionally perform a command.
оператор if — Пакет — If, ElseIf, Else
спросил
Изменено
1 год, 7 месяцев назад
Просмотрено
235 тысяч раз
Что не так с этим кодом?
ЕСЛИ "%language%" == "de" ( перейти на язык DE ) ЕЩЕ ( ЕСЛИ "%language%" == "en" ( перейти на языкEN ) ЕЩЕ ( эхо Не найдено.)
Я не очень хорошо разбираюсь в Batch.
1
@эхо выключено название Тест эхо Выберите язык. (нем./англ.) установить /p язык= ЕСЛИ /i "%language%"=="de" перейти к языкуDE ЕСЛИ /i "%language%"=="ru" перейти к языкуEN эхо Не найдено. идти к общему выходу :languageDE эхо немецкий идти к общему выходу :languageEN эхо английский идти к общему выходу :commonexit Пауза
Дело в том, что пакет просто продолжает выполнять инструкции, строка за строкой, пока не достигнет перейти к
, выйти
или конец файла. Он не имеет концепции секций
для управления потоком.
Следовательно, ввод de
приведет к переходу к :languagede
, затем просто продолжит выполнение инструкций, пока файл не закончится, показывая de
, затем en
, затем not found
.
2
@эхо выключено установить "язык = де" ЕСЛИ "%language%" == "de" ( перейти на язык DE ) ЕЩЕ ( ЕСЛИ "%language%" == "en" ( перейти на языкEN ) ЕЩЕ ( эхо Не найдено.) ) :languageEN :languageDE эхо %язык%
Это работает, но я не знаю, как определена ваша языковая переменная. В ее определении есть пробелы.
1
пакетные файлы выполняют простую замену строк переменными.
Итак, простой
goto :language%language% эхо не найдено ...
делает это без необходимости if.
1
Рекомендация. Не используйте добавленные пользователем операторы REM для блокировки пакетных шагов. Вместо этого используйте условный GOTO.
Таким образом, вы можете предварительно определить и протестировать шаги и параметры. Пользователи также получают гораздо более простые изменения и большую уверенность.
@Эхо включено rem Использование флагов для управления выполнением команды УСТАНОВИТЬ ExecuteSection1 = 0 УСТАНОВИТЬ ExecuteSection2 = 1 @эхо выключено ЕСЛИ %ExecuteSection1%==0 GOTO EndSection1 ЭХО Раздел 1 Здесь : EndSection1 ЕСЛИ %ExecuteSection2%==0 GOTO EndSection2 ЭХО Раздел 2 Здесь : EndSection2
@эхо выключено цвет 0а установить /p язык= если %language% == DE ( перейти к LGDE ) еще ( если %language% == EN ( перейти к LGEN ) еще ( эхо н/д ) : LGDE (код) :ЛГЕН (код)
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
9Оператор 0000 if — Как использовать структуру if-else в пакетном файле?
спросил
Изменено
2 года, 6 месяцев назад
Просмотрено
871 тысяч раз
У меня есть вопрос о структуре if-else в пакетном файле. Каждая команда запускается отдельно, но я не мог безопасно использовать блоки «если-иначе», поэтому эти части моей программы не работают. Как я могу заставить эти части работать? Спасибо.
ЕСЛИ %F%==1 ЕСЛИ %C%==1 ( :: копирование файла c в d скопировать "%sourceFile%" "%destinationFile%" ) ИНАЧЕ ЕСЛИ %F%==1 ЕСЛИ %C%==0 ( :: перемещение файла c в d переместить "%sourceFile%" "%destinationFile%" ) ИНАЧЕ ЕСЛИ %F%==0 ЕСЛИ %C%==1 ( ::копирование каталога c из d, /s: boş olanlar hariç, /e:boş olanlar dahil xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e ) ИНАЧЕ ЕСЛИ %F%==0 ЕСЛИ %C%==0 ( ::перемещение каталога xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%" rd /s /q "%sourceMoveDirectory%" )
- пакетный файл
- оператор if
4
Неверный синтаксис. Вы не можете использовать ELSE IF
. Похоже, вам это все равно не нужно. Просто используйте несколько операторов
IF
:
IF %F%==1 IF %C%==1 ( :: копирование файла c в d скопировать "%sourceFile%" "%destinationFile%" ) ЕСЛИ %F%==1 ЕСЛИ %C%==0 ( :: перемещение файла c в d переместить "%sourceFile%" "%destinationFile%" ) ЕСЛИ %F%==0 ЕСЛИ %C%==1 ( ::копирование каталога c из d, /s: boş olanlar hariç, /e:boş olanlar dahil xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e ) ЕСЛИ %F%==0 ЕСЛИ %C%==0 ( ::перемещение каталога xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%" rd /s /q "%sourceMoveDirectory%" )
Ссылка на отличный пакетный файл: http://ss64.com/nt/if.html
8
Я думаю, что в вопросе и в некоторых ответах есть небольшая путаница в отношении значения этого псевдокода в DOS: IF A IF B X ELSE Y. Это не означает IF (A и B) THEN X ELSE Y, но на самом деле означает ЕСЛИ А (ЕСЛИ В, ТО Х, ИНАЧЕ Y). Если проверка A не пройдена, то все внутреннее условие if-else будет проигнорировано.
Как упоминалось в одном из ответов, в этом случае только один из тестов может быть успешным, поэтому «иначе» не требуется, но, конечно, это работает только в этом примере, это не общее решение для выполнения if-else .
Есть много способов обойти это. Вот несколько идей, все довольно уродливые, но эй, это (или, по крайней мере, был) DOS!
@эхо выключено установить один = 1 установить два = 2 РЭМ Пример 1 ЕСЛИ %один%_%два%==1_1 ( эхо Пример 1 не работает ) ИНАЧЕ, ЕСЛИ %one%_%two%==1_2 ( echo Пример 1 работает корректно ) ЕЩЕ ( эхо Пример 1 не работает ) РЭМ Пример 2 установить test1result = 0 установить test2result = 0 если %one%==1 если %two%==1 установить test1result=1 если %one%==1 если %two%==2 установить test2result=1 ЕСЛИ %test1result%==1 ( эхо Пример 2 не работает ) ИНАЧЕ, ЕСЛИ %test2result%==1 ( echo Пример 2 работает правильно ) ЕЩЕ ( эхо Пример 2 не работает ) РЭМ Пример 3 если %one%==1 если %two%==1 ( эхо Пример 3 не работает перейти: endoftests ) если %one%==1 если %two%==2 ( echo Пример 3 работает правильно перейти: endoftests ) эхо Пример 3 не работает ) :эндофтесты
1
Насколько я знаю, вы не можете сделать , если еще
в пакетном режиме, как вы можете на других языках, он должен быть вложенным , если
.
Использование вложенного , если
ваша партия будет выглядеть как
IF %F%==1 IF %C%==1( :: копирование файла c в d скопировать "%sourceFile%" "%destinationFile%" ) ЕЩЕ ( ЕСЛИ %F%==1 ЕСЛИ %C%==0( :: перемещение файла c в d переместить "%sourceFile%" "%destinationFile%" ) ЕЩЕ ( ЕСЛИ %F%==0 ЕСЛИ %C%==1( ::копирование каталога c из d, /s: boş olanlar hariç, /e:boş olanlar dahil xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e ) ЕЩЕ ( ЕСЛИ %F%==0 ЕСЛИ %C%==0( ::перемещение каталога xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%" rd /s /q "%sourceMoveDirectory%" ) ) ) )
или, как предложил Джеймс, соедините ваши , если
, однако я думаю, что правильный синтаксис —
IF %F%==1 IF %C%==1( :: копирование файла c в d скопировать "%sourceFile%" "%destinationFile%" )
5
вот как я справился с ситуацией if else if
if %env%==dev ( echo "dev env selected selected" ) еще ( если %env%==продукт ( echo "Выбрано окружение prod" ) )
Примечание это не то же самое, что блок if-elseif, как в других языках программирования, таких как C++ или Java, но он будет делать то, что вам нужно
Я думаю, вы можете использовать что-то вроде
, если ___ ( сделай это ) иначе, если ___ ( сделай это )
3
Немного запоздало и, возможно, все еще хорошо для сложных условий if, потому что я хотел бы добавить параметр «выполнено», чтобы сохранить структуру if-then-else:
set done=0 если %F%==1 если %C%==0 (установить done=1 и найти эхо F=1 и C=0: %F% + %C%) если %F%==2 если %C%==0 (установить done=1 и найти эхо F=2 и C=0: %F% + %C%) если %F%==3 если %C%==0 (установить done=1 и найти эхо F=3 и C=0: %F% + %C%) если %done%==0 (эхо сделать что-то)
IF.
конструкции очень хорошо работают в пакетных файлах, в частности, когда вы используете только одно условное выражение в каждой строке IF: ..ELSE IF
IF %F%==1 ( :: копирование файла c в d скопировать "%sourceFile%1" "%destinationFile1%" ) ИНАЧЕ, ЕСЛИ %F%==0 ( :: перемещение файла e в f переместить "%sourceFile2%" "%destinationFile2%" )
В вашем примере используется конструкция типа IF...AND...IF
, где одновременно должны выполняться 2 условия. В этом случае вы все еще можете использовать IF...ELSE IF
конструкция, но с дополнительными круглыми скобками, чтобы избежать неопределенности для следующего условия ELSE:
IF %F%==1 (IF %C%==1 ( :: копирование файла c в d скопировать "%sourceFile1%" "%destinationFile1%" ) ) ИНАЧЕ, ЕСЛИ %F%==1 (ЕСЛИ %C%==0 ( :: перемещение файла e в f переместить "%sourceFile2%" "%destinationFile2%"))
Приведенная выше конструкция эквивалентна:
IF %F%==1 ( ЕСЛИ %С%==1 ( :: копирование файла c в d скопировать "%sourceFile1%" "%destinationFile1%" ) ИНАЧЕ, ЕСЛИ %C%==0 ( :: перемещение файла e в f переместить "%sourceFile2%" "%destinationFile2%"))
Последовательность обработки пакетных команд зависит от порядка разбора CMD. exe. Просто убедитесь, что ваша конструкция следует этому логическому порядку, и, как правило, она будет работать. Если ваш пакетный скрипт обрабатывается Cmd.exe без ошибок, значит, это правильная (т.е. поддерживаемая вашей версией ОС Cmd.exe) конструкция, даже если кто-то сказал обратное.
Вот мой пример кода для if..else..if
, которые делают следующее
Запрашивать у пользователя имя процесса
Если имя процесса неверный
Затем он пишет пользователю
Ошибка: кажется, что указанный выше процессор не существует
, если имя процесса services
, тогда он пишет пользователю
Ошибка: вы не можете убить процессор выше
, если имя процесса действительное , а не services
Тогда он пишет пользователю
процесс был убит через taskill
поэтому я назвал его Процесс killer.bat
Вот мой код:
@echo off
:Начинать
Рем готовит партию
клс
Убийца процессоров
Цвет 0B
Echo Введите имя процессора, чтобы убить его (без «.