Ответы:
Вы можете сделать and
с вложенными условиями:
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
или:
if %age% geq 2 if %age% leq 12 set class=child
Вы можете сделать or
с отдельной переменной:
set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
set state=asleep
)
set res=
или set res=1
и то, if defined res
что немного более устойчиво к опечаткам и работает даже в блоках без явного включения отложенного расширения.
Оператор IF
не поддерживает логические операторы ( AND
и OR
), каскадные IF
операторы создают неявное соединение.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Если File1.Dat
и File1.Dat
существует, то прыгнуть ярлык FILE12_EXIST_LABEL
.
Смотрите также: IF /?
Законы де Моргана позволяют нам преобразовывать дизъюнкции («ИЛИ») в логические эквиваленты, используя только конъюнкции («И») и отрицания («НЕ»). Это означает, что мы можем связать дизъюнкции («ИЛИ») в одну строку.
Это означает, что если зовут «Якко» или «Вакко» или «Точка», то эхо «Уорнер брат или сестра».
set warner=true
if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false
if "%warner%"=="true" echo Warner brother or sister
Это еще одна версия примера «ИЛИ» Паккдиабло, но условия связаны одной строкой. (Обратите внимание, что противоположность leq
есть gtr
, а противоположность geq
есть lss
.)
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
В следующих примерах показано, как сделать оператор AND (используется для установки переменных или включения параметров для команды).
Чтобы запустить Блокнот и закрыть окно CMD:
start notepad.exe & exit
Установить переменные x, y и z в значения, если переменная 'a' равна бла.
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
Надеюсь, это поможет!
ИЛИ немного сложнее, но не слишком. Вот пример
set var1=%~1
set var2=%~2
::
set or_=
if "%var1%"=="Stack" set or_=true
if "%var2%"=="Overflow" set or_=true
if defined or_ echo Stack OR Overflow
Атул Пракаш (в то время ему было 16 лет) дал логическую идею о том, как реализовать тест OR, отменив условия в операторах IF, а затем используя предложение ELSE в качестве места для размещения кода, требующего выполнения. Я подумал, что, однако, обычно нужны еще два предложения, поскольку он предлагает использовать два оператора IF, и поэтому исполняемый код должен быть написан дважды . Однако, если GOTO используется для пропуска необходимого кода, вместо написания предложений ELSE код для выполнения необходимо написать только один раз .
Вот тестируемый пример того, как я бы реализовал негативную логику Атула Пракаша для создания ИЛИ .
В моем примере кому-то разрешено водить танк, если у него есть лицензия на танк ИЛИ он проходит военную службу . Введите true или false в двух запросах, и вы сможете увидеть, позволяет ли логика управлять танком.
@ECHO OFF
@SET /p tanklicence=tanklicence:
@SET /p militaryservice=militaryservice:
IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done
ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice%
:done
PAUSE
Если вам интересно написать if
+ AND
/ OR
в одном утверждении, то его нет. Но, вы можете по- прежнему группа if
с &&
/ ||
и (
/ )
заявления добиться того, что вы хотите в одной строке без каких - либо дополнительных переменных и без if-else
блока дублирования (одной echo
команды для TRUE
и FALSE
секций кода):
@echo off
setlocal
set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND
echo.
set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR
exit /b 0
:IF_OR
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+
exit /b 0
:IF_AND
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE-
exit /b 0
Выход :
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
Хитрость в type
команде, которая сбрасывает / устанавливает errorlevel
и обрабатывает путь к следующей команде.
Попробуйте операнд отрицания - «нет»!
Что ж, если вы можете выполнить операцию «И» над оператором if с использованием вложенных «если» (см. Предыдущие ответы), то вы можете сделать то же самое с «если нет» для выполнения операции «или».
Если вы еще не поняли идею, читайте дальше. В противном случае, просто не тратьте свое время и вернитесь к программированию.
Так же, как вложенные «если» удовлетворяются только тогда, когда все условия выполняются, вложенные «если нет» выполняются только тогда, когда все условия являются ложными. Это похоже на то, что вы хотите сделать с операндом 'или', не так ли?
Даже если любое из условий во вложенном «если нет» верно, все утверждение остается неудовлетворенным. Следовательно, вы можете использовать отрицательное «если последовательно», помня, что тело оператора условия должно быть тем, что вы хотите сделать, если все ваши вложенные условия ложны. Тело, которое вы на самом деле хотели дать, должно соответствовать заявлению else.
И если вы все еще не поняли суть дела, извините, мне 16 лет, и это лучшее, что я могу сделать, чтобы объяснить.
Это так же просто, как следующее:
И> если + если
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
ИЛИ> если // если
set BOTH=0
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1
if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something*
if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something*
Я знаю, что есть и другие ответы, но я думаю, что шахта более проста, поэтому ее легче понять. Надеюсь, это поможет вам! ;)
Альтернативой является поиск оболочки Unix, которая дает вам логические операторы и многое другое. Вы можете получить родную реализация win32 из Bourne оболочки здесь , если вы не хотите идти Cygwin маршрута. Родной Bash можно найти здесь . Я совершенно уверен, что вы могли бы легко найти другие хорошие альтернативы, такие как zsh или tcsh.
К
Небольшая модификация ответа Андри, сокращающая дублирование команд типа:
set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND
echo.
set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR
goto :eof
:IF_OR
(if /i not %A% EQU 1 (
if /i not %B% EQU 2 (
echo FALSE-
type 2>nul
)
)) && echo TRUE+
goto :eof
:IF_AND
(if /i %A% EQU 1 (
if /i %B% EQU 2 (
echo TRUE+
type 2>nul
)
)) && echo FALSE-
goto :eof