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.Datexist затем перейти метку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 "или", но условия прикованы к одной строке. (Обратите внимание, что напротив
leqisgtr, и напротив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