cmd.exe:复杂的条件?

sho*_*osh 13 windows conditional batch-file

在DOS批处理文件中,在IF语句中,是否可以使用AND或OR组合两个或多个条件?我无法找到任何相关文档

编辑 - help if并且MS文档没有说明在if中使用多个条件.

我想AND的解决方法就是做

if COND1 (
  if COND2 (
    cmd
  )
)
Run Code Online (Sandbox Code Playgroud)

但这正是我想要避免的.

Joe*_*oey 14

不,没有更简单的方法.

因为and你也可以在不引入块的情况下链接它们:

if COND1 if COND2 ...
Run Code Online (Sandbox Code Playgroud)

坦率地说,并不比任何更糟糕

if COND1 and COND2 ...
Run Code Online (Sandbox Code Playgroud)

然而,因为or它变得更加丑陋,确实:

set COND=
if COND1 set COND=1
if COND2 set COND=1
if defined COND ...
Run Code Online (Sandbox Code Playgroud)

要么:

if COND1 goto :meh
if COND2 goto :meh
goto :meh2
:meh
...
:meh2
Run Code Online (Sandbox Code Playgroud)

我曾经看过一个批处理预处理器,它使用类似C语法的控制流和中间的批处理,然后将这些条件转换成多个跳转和检查.但是,那个东西是针对DOS批处理文件的,在Windows环境中几乎没有用.


Meh*_*eza 9

我有时想知道,现在人们在学校里学到了什么!当然'OR'也是可能的.任何可以为您提供"NOT"和"AND"的系统都会自动为您提供"OR",因为:

x OR y = NOT((不是x)和(不是y))http://en.wikipedia.org/wiki/De_Morgan%27s_laws

所以只要表达式"if(x AND y)then do z"就可以这样写:

if (x) if (y) (do z)
Run Code Online (Sandbox Code Playgroud)

...我们应该能够写出表达式"if(x OR y)then do z",但是有一个问题:

我们应该把第一个'不'放在哪里?那么,答案是无处可去的,我们应该先将上面的等式改为:

NOT(x OR y)=(NOT x)AND(NOT y)

根据这个,我们可以写"if(NOT(x OR y))then(do z)"如下:

"if((NOT x)AND(NOT y))then(do z)"

有了这个并且知道如何表达和如上所示,我们现在可以将表达式"if(NOT(x OR y))然后(do z)"写为:

if (not x) if (not y) (REM do z)
Run Code Online (Sandbox Code Playgroud)

我们也知道表达式:

"if(NOT p)then(do q)else(do r)"

......相当于:

"if(p)then(do r)else(do q)

因此我们可以写"if(x OR y)then(do z)":

"if(NOT(x OR y))then(什么都不做)else(do z)"

所以我们可以将"if(x OR y)then(do z)"表示为:

if (not x) if (not y) (REM do nothing) else (REM do z)
Run Code Online (Sandbox Code Playgroud)

但这还没有完成,因为这不是一个真正的'AND'而是一个"模拟"的.缺少的是第二个.因此,获得正确结果的完整形式应该是:

if (not x) ( if (not y) (REM do nothing) else (REM do z) ) else (REM do z) )
Run Code Online (Sandbox Code Playgroud)

...其中有丑陋的双重其他部分.你可以用'goto'来解决这个问题,我们最终得到:

rem if (x OR y) then (do z):
if (not x) ( if (not y) (goto :doNothing) )
rem do z
:doNothing
Run Code Online (Sandbox Code Playgroud)