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

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

11 ответов


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

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

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

если File1.Dat и File1.Dat exist затем перейти метку FILE12_EXIST_LABEL.

Читайте также: IF /?


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

это означает, что если имя "Якко" или "Вакко" или "точка", то эхо "Warner brother или sister".

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 is gtr, и напротив geq is lss.)

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

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

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

exit & start notepad.exe

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

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

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


также в
"120} Как использовать операторы AND/OR/XOR/NOT В IF statement?"
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

альтернативой является поиск оболочки unix, которая дает вам логические операторы и многое другое. Вы можете получить собственную реализацию win32 оболочки Bourne здесь Если вы не хотите идти по маршруту cygwin. Родной Баш можно найти здесь. Я совершенно уверен, что вы можете легко google другие хорошие альтернативы, такие как zsh или tcsh.

K


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

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

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

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

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

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


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

вот проверяемый пример того, как я бы реализовал отрицательную логику Атула Пракаша, чтобы создать или.

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

if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*

или> if / / if

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*

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


если вы заинтересованы, чтобы написать if+AND/OR в одном утверждении, тогда нет ничего из этого. Но, вы все еще можете group if С &&/|| и (/) операторы для достижения того, что вы хотите в одной строке без каких-либо дополнительных переменных и без if-else блок дублирования (один на 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 и так обрабатывает путь к следующей команде.


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

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