Логические операторы ( "и", "или" ) в партии DOS

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

Ответ 1

Вы можете сделать 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
)

Ответ 2

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

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

Если существуют File1.Dat и File1.Dat, то переместите метку FILE12_EXIST_LABEL.

Смотрите также: IF /?

Ответ 3

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

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

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 "OR", но условия привязаны к одной строке. (Заметим, что противоположность leq равна gtr, а противоположность geq равна lss.)

set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep

Ответ 4

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

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

exit & start notepad.exe

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

if %a% equ blah set x=1 & set y=2 & set z=3

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

Ответ 5

Также рассматривается в
"120} Как использовать операторы AND/OR/XOR/NOT в инструкции IF?"
http://www.netikka.net/tsneti/info/tscmd120.htm

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

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

Ответ 6

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

Хорошо, если вы можете выполнять операцию "И" в выражении if с помощью вложенных "if (см. предыдущие ответы), то вы можете сделать то же самое с" if not "для выполнения операции" или ".

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

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

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

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

Ответ 7

Альтернативой является поиск оболочки unix, которая дает вам логические операторы и многое другое. Вы можете получить исходную win32-версию оболочки Bourne здесь, если вы не хотите идти по маршруту cygwin. Нативный bash можно найти здесь. Я совершенно уверен, что вы можете легко использовать другие хорошие альтернативы Google, такие как zsh или tcsh.

К

Ответ 8

Athul Prakash (возраст 16 в то время) дал логическую идею о том, как реализовать тест OR, отрицая условия в операторах IF, а затем используя предложение ELSE в качестве места для размещения кода, который требует выполнения. Я подумал, что есть, как правило, два дополнительных предложения, поскольку он предлагает использовать два оператора IF, поэтому исполняемый код должен быть написан дважды. Однако, если GOTO используется для прохода мимо требуемого кода, вместо написания предложений ELSE код для выполнения должен быть написан только один раз.

Вот примерный пример того, как я буду использовать отрицательную логику Athul Prakash для создания ИЛИ.

В моем примере кому-то разрешено управлять цистерной, если у них есть лицензия на танк, или они выполняют свою военную службу. Введите 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

Ответ 9

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

AND > if + if

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*

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

Ответ 10

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

Ответ 11

Небольшая модификация ответа Andry, уменьшающая команды дублирующего типа:

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