Answers:
您可以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
)
set res=
or set res=1
,然后再使用if defined res
它来抵御拼写错误,甚至可以在没有显式启用延迟扩展的情况下在块中使用。
该IF
语句不支持逻辑运算符(AND
和OR
),级联IF
语句进行隐式连接。
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
如果File1.Dat
和 File1.Dat
存在,则跳转标签FILE12_EXIST_LABEL
。
也可以看看: IF /?
戴摩根定律允许我们仅使用连词(“与”)和否定(“非”)将析取词(“ OR”)转换为逻辑等价物。这意味着我们可以将析取词(“ OR”)链接到一条线上。
这意味着如果名称是“ Yakko”或“ Wakko”或“ Dot”,则回显“ Warner兄弟或姐妹”。
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
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
OR有点棘手,但并非如此。这是一个例子
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
Athul Prakash(当时16岁)通过否定IF语句中的条件,然后使用ELSE子句作为放置需要执行代码的位置,给出了如何实施OR测试的逻辑思路。我对自己说,由于他建议使用两个IF语句,因此通常需要另外两个子句,因此执行的代码需要编写两次。但是,如果使用GOTO跳过了所需的代码,则无需编写ELSE子句,只需编写一次即可执行代码。
这是一个如何测试Athul Prakash的否定逻辑以创建OR的可测试示例。
在我的示例中,如果某人持有坦克牌照或正在服兵役,则允许其驾驶坦克。在两个提示下输入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
+ 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
,因此可以处理下一条命令。
尝试取反操作数-'不'!
好吧,如果您可以使用嵌套的“ if”对if语句执行“ AND”运算(请参阅前面的答案),那么可以对“ if not”执行相同的操作来执行“ or”运算。
如果您还没有这个主意,请继续阅读。否则,请不要浪费您的时间并返回编程。
就像只有在所有条件都为真时才满足嵌套的“ if”一样,只有在所有条件都为false时才满足嵌套的“ if”。这类似于您要对“或”操作数执行的操作,不是吗?
即使嵌套的“如果不是”中的任何一个条件为真,整个语句仍将不满足。因此,通过记住条件语句的主体应该是所有嵌套条件均为假的情况,可以连续使用否定的“ if”。您实际想要给出的主体应位于else语句下。
而且,如果您仍然不明白这件事,对不起,我16岁,这是我能尽全力解释的事情。
就像下面这样简单:
AND>如果+如果
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
OR>如果//如果
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*
我知道还有其他答案,但是我认为我的问题更简单,因此更容易理解。希望这对您有所帮助!;)
另一种选择是寻找一个unix shell,它确实为您提供逻辑运算符以及更多其他功能。如果不想走cygwin路线,可以在这里获得Bourne shell的本地win32实现。在这里可以找到本地的bash 。我敢肯定,您可以轻松地用Google搜索其他好的替代方法,例如zsh或tcsh。
ķ
稍微修改了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