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


当前回答

这就像下面这样简单:

如果和>如果+

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

OR> 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*

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

其他回答

Athul Prakash (age 16 at the time) gave a logical idea for how to implement an OR test by negating the conditions in IF statements and then using the ELSE clause as the location to put the code that requires execution. I thought to myself that there are however two else clauses usually needed since he is suggesting using two IF statements, and so the executed code needs to be written twice. However, if a GOTO is used to skip past the required code, instead of writing ELSE clauses the code for execution only needs to be written once.

下面是一个可测试的例子,我将如何实现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 Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL

如果存在File1.Dat和File2.Dat,则跳转到标签FILE12_EXIST_LABEL。

参见:IF /?

如果你需要else子句,你可以使用下面的语法:

AND:

if %v1% == a (if %v2% == b (echo yes) else echo no) else echo no

OR:

if %v1% == a (echo yes) else (if %v2% == b (echo yes) else echo no)

下面的例子展示了如何创建AND语句(用于为命令设置变量或包含参数)。

启动记事本并关闭CMD窗口:

start notepad.exe & exit

如果变量'a' = blah,则设置变量x、y和z的值。

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

希望有帮助!

对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