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



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

673   11  

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
)

The 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 /?

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

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

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 и lss.)

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

чтобы закрыть окно 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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.