Логические операторы («и», «или») в пакете DOS - PullRequest
230 голосов
/ 27 января 2010

Как бы вы реализовали логические операторы в пакетных файлах DOS?

Ответы [ 11 ]

268 голосов
/ 27 января 2010

Вы можете сделать 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
)
65 голосов
/ 27 января 2010

Оператор IF не поддерживает логические операторы (AND и OR), каскадные операторы IF создают неявное соединение.

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL

Если File1.Dat и File1.Dat существует, затем перейдите по метке FILE12_EXIST_LABEL.

См. Также: IF /?

50 голосов
/ 16 мая 2012

Законы Де Моргана позволяют нам преобразовывать дизъюнкции ("ИЛИ") в логические эквиваленты, используя только конъюнкции ("И") и отрицания ("НЕ"). Это означает, что мы можем связать дизъюнкции («ИЛИ») в одну строку.

Это означает, что если имя "Якко" или "Вакко" или "Точка", то эхо "Уорнер брат или сестра".

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

Это еще одна версия примера "или" paxdiablo, но условия связаны одной строкой. (Обратите внимание, что противоположное leq равно gtr, а противоположное geq равно lss.)

set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
5 голосов
/ 30 ноября 2011

В следующих примерах показано, как создать оператор AND (используется для установки переменных или включения параметров для команды).

Чтобы запустить Блокнот и закрыть окно CMD:

start notepad.exe & exit

Чтобы установить значения переменных x, y и z, если переменная 'a' равна бла.

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

Надеюсь, это поможет!

4 голосов
/ 23 июля 2012

ИЛИ немного сложнее, но не слишком. Вот пример

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
1 голос
/ 22 июля 2017

Если вы хотите написать 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 и обрабатывает путь к следующей команде.

1 голос
/ 22 декабря 2015

Это так же просто, как следующее:

И> если +, если

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*

Я знаю, что есть и другие ответы, но я думаю, что шахта более простая, поэтому ее легче понять. Надеюсь, это поможет вам! ;)

1 голос
/ 17 августа 2015

Атул Пракаш (в то время ему было 16 лет) дал логическую идею о том, как реализовать тест ИЛИ, отменив условия в операторах 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
1 голос
/ 22 апреля 2014

Попробуйте операнд отрицания - «не»!

Что ж, если вы можете выполнить операцию «И» над оператором if, используя вложенные «если» (см. Предыдущие ответы), то вы можете сделать то же самое с «если нет» для выполнения операции «или».

Если вы еще не поняли идею, продолжайте читать. В противном случае, просто не тратьте свое время и вернитесь к программированию.

Точно так же, как вложенные «если удовлетворены только тогда, когда все условия выполняются, вложенные», если нет удовлетворяются только, когда все условия являются ложными Это похоже на то, что вы хотите сделать с операндом 'or', не так ли?

Даже если любое из условий во вложенном «если нет» истинно, все утверждение остается неудовлетворенным. Следовательно, вы можете использовать отрицательное 'if в последовательности, помня, что тело оператора условия должно быть тем, что вы хотите сделать, если все ваши вложенные условия ложны. Тело, которое вы на самом деле хотели дать, должно соответствовать заявлению else.

И если вы до сих пор не поняли суть дела, извините, мне 16 лет, и это лучшее, что я могу сделать, чтобы объяснить.

0 голосов
/ 22 сентября 2017

Небольшая модификация ответа Андри, сокращение дублирующих команд:

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
...