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环境中几乎没有用.
我有时想知道,现在人们在学校里学到了什么!当然'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)
| 归档时间: |
|
| 查看次数: |
19275 次 |
| 最近记录: |