Batch file DOS批处理中的逻辑运算符(“and”、“or”或“or”)

Batch file DOS批处理中的逻辑运算符(“and”、“or”或“or”),batch-file,cmd,logical-operators,windows-console,Batch File,Cmd,Logical Operators,Windows Console,如何在DOS批处理文件中实现逻辑运算符?IF语句不支持逻辑运算符和和或。 级联如果语句进行隐式连接: IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL 如果File1.Dat和File2.Dat存在,则跳到标签FILE12\u exist\u标签 另请参见:您可以使用嵌套条件执行和: if %age% geq 2 ( if %age% leq 12 ( set class=child )

如何在DOS批处理文件中实现逻辑运算符?

IF语句不支持逻辑运算符
。
级联
如果
语句进行隐式连接:

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
如果
File1.Dat
File2.Dat
存在,则跳到标签
FILE12\u exist\u标签


另请参见:

您可以使用嵌套条件执行

if %age% geq 2 (
    if %age% leq 12 (
        set class=child
    )
)
或:

您可以使用单独的变量执行

set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
    set state=asleep
)

另一种选择是寻找一个unixshell,它确实为您提供了逻辑运算符和更多。如果您不想走cygwin路线,可以获得Bourne shell的本机win32实现。可以找到本地bash。我很确定你可以很容易地在谷歌上搜索到其他好的选择,比如zsh或tcsh


K

以下示例演示如何生成AND语句(用于设置变量或包含命令的参数)

要启动记事本并关闭CMD窗口,请执行以下操作:

start notepad.exe & exit
如果变量“a”等于blah,则将变量x、y和z设置为值

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
希望有帮助

允许我们仅使用连词(“AND”)和否定(“NOT”)将析取(“OR”)转换为逻辑等价物。这意味着我们可以将析取(“或”)链接到一条线上

这意味着如果名字是“雅科”或“瓦科”或“点”,那么回声“华纳兄弟或姐妹”

这是paxdiablo的“或”示例的另一个版本,但条件被链接到一行。(注意,
leq
的对立面是
gtr
,而
geq
的对立面是
lss


或者有点棘手,但也不过分。这里有一个例子

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

尝试求反操作数-‘not’

好的,如果您可以使用嵌套的if(参考前面的答案)对if语句执行'AND'操作,那么您可以使用'if not'执行'or'操作

如果你还没有完全明白,继续读下去。否则,就不要浪费时间,回到编程上来

正如嵌套的“如果”仅在所有条件都为真时满足一样,嵌套的“如果不是”仅在所有条件都为假时满足。这类似于要对“或”操作数执行的操作,不是吗

即使嵌套的“if not”中的任何一个条件为true,整个语句仍然不满足。因此,您可以通过记住如果所有嵌套条件都为false,那么condition语句的主体应该是您想要做的,从而连续使用否定的if。你真正想要给予的身体应该在else语句下

如果你还没有得到这件事的jist,对不起,我16岁了,这是我能做的最好的解释。

Athul Prakash(当时16岁)给出了一个关于如何实现OR测试的逻辑想法,方法是否定if语句中的条件,然后使用ELSE子句作为放置需要执行的代码的位置。我想,不过通常还需要另外两个子句,因为他建议使用两个IF语句,因此执行的代码需要编写两次。但是,如果使用GOTO跳过所需的代码,而不是编写ELSE子句,则执行代码只需编写一次

下面是一个可测试的例子,我将如何实现Athul Prakash的否定逻辑来创建

在我的例子中,如果某人持有坦克牌照或正在服兵役,则允许他驾驶坦克。在两个提示下输入truefalse,您将能够看到逻辑是否允许您驾驶坦克

@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

它与以下内容一样简单:

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*

我知道还有其他答案,但我认为我的答案更简单,所以更容易理解。希望这对你有帮助!;)

如果您有兴趣在一个语句中编写
If
+
/
,则没有任何语句。但是,您仍然可以使用
&&
/
|
/
语句对
进行分组,以实现您希望在一行中不带任何附加变量和不带
if else
块重复(用于
TRUE
FALSE
代码部分的单个
echo
命令):

输出

TRUE+
FALSE-
FALSE-
FALSE-

TRUE+
TRUE+
TRUE+
FALSE-

诀窍在于
type
命令,该命令会删除/设置
errorlevel
,从而处理到下一个命令的方式。

对Andry的答案进行轻微修改,减少重复的type命令:

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

只有OR部分比较复杂,但对于包含NOT OR的一般布尔表达式,唯一好的解决方案是:

REM if A == B OR C == C then yes

(call :strequ A B || call :strequ C C) && echo yes
exit /b

:strequ
if "%1" == "%2" exit /b 0
exit /b 1

我提交供您查看:pi.bat:)您也可以只使用
set res=
set res=1
,然后使用
if defined res
,它对拼写错误更为鲁棒,甚至可以在块中工作,而无需显式启用延迟扩展。只需稍微改进您的答案。。。您不需要显式嵌套“if”语句。。。正如Dave Jarvis在下文中演示的那样,您可以将它们“链接”起来。如果set=true,则不要在set=true之后留下任何空格,否则事情就无法正常运行。它会将值“true”存储在变量中……您描述的“or”条件很光滑,适用于一系列数字,但如果我比较的是两个独立的值,而不是一个范围,该怎么办?例如,如果此文件存在或filename==“”@bakoyaro,则可以使用任何条件将res设置为true,包括您提到的那些。如果要使用不同的shell,至少要使用PowerShell:有许多shell比DOS更好。我之所以使用DOS bat文件,是因为它不需要任何外部工具。如果你有一个客户
@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-
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
REM if A == B OR C == C then yes

(call :strequ A B || call :strequ C C) && echo yes
exit /b

:strequ
if "%1" == "%2" exit /b 0
exit /b 1