Mec*_*ash 82 windows conditional cmd if-statement batch-file
有没有办法在Windows批处理文件中编写IF或IF条件语句?
例如:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
Run Code Online (Sandbox Code Playgroud)
dbe*_*ham 87
zmbq解决方案很好,但不能在所有情况下使用,例如在FOR DO(...)循环之类的代码块内.
另一种方法是使用指标变量.将其初始化为未定义,然后仅在任何一个OR条件为真时定义它.然后使用IF DEFINED作为最终测试 - 无需使用延迟扩展.
FOR ..... DO (
set "TRUE="
IF cond1 set TRUE=1
IF cond2 set TRUE=1
IF defined TRUE (
...
) else (
...
)
)
Run Code Online (Sandbox Code Playgroud)
您可以添加arasmussen使用的ELSE IF逻辑,理由是如果第一个条件为真,它可能会执行得更快,但我从不打扰.
附录 - 这是一个重复的问题,在IF语句WinXP批处理脚本中使用OR的答案几乎相同
最后的附录 - 我几乎忘记了我最喜欢的技术来测试变量是否是值列表中的任何一个.初始化包含可接受值的分隔列表的测试变量,然后使用搜索和替换来测试您的变量是否在列表中.这非常快,并且对于任意长的列表使用最少的代码.它确实需要延迟扩展(或者CALL %% VAR %%技巧).此外,测试是CASE INSENSITIVE.
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)
Run Code Online (Sandbox Code Playgroud)
如果VAR包含上述内容可能会失败=,因此测试不是万无一失的.
如果在需要延迟扩展的块中进行测试,则访问VAR的当前值
for ... do (
set "TEST=;val1;val2;val3;val4;val5;"
for /f %%A in (";!VAR!;") do if "!TEST:%%A=!" neq "!TEST!" (echo true) else (echo false)
)
Run Code Online (Sandbox Code Playgroud)
根据VAR中的预期值,可能需要"delims ="等选项
即使=在VAR中添加更多代码,上述策略也可以变得可靠.
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true
Run Code Online (Sandbox Code Playgroud)
但是现在我们已经失去了提供ELSE子句的能力,除非我们添加一个指示变量.代码开始看起来有点"丑陋",但我认为如果VAR是任意数量的不区分大小写的选项中的任何一个,那么它是最好的可靠测试方法.
最后有一个更简单的版本,我认为稍微慢一点,因为它必须为每个值执行一个IF.Aacini在对前面提到的链接中接受的答案的评论中提供了这个解决方案
for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A do echo true
Run Code Online (Sandbox Code Playgroud)
值列表不能包含*或?字符和值,%VAR%不应包含引号.如果%VAR%还包含空格或特殊字符等^,则引号会导致问题&.此解决方案的另一个限制是它不提供ELSE子句的选项,除非您添加指示符变量.优点是它可以区分大小写或不敏感,具体取决于是否存在IF /I选项.
zmb*_*mbq 48
我不这么认为.只需使用两个IF和GOTO相同的标签:
IF cond1 GOTO foundit
IF cond2 GOTO foundit
ECHO Didn't found it
GOTO end
:foundit
ECHO Found it!
:end
Run Code Online (Sandbox Code Playgroud)
小智 7
感谢这篇文章,它给了我很多帮助.
Dunno,如果它可以帮助,但我有问题,并感谢你,我发现我认为是另一种方法来解决它基于这个布尔等价:
"A或B"与"not(不是A而不是B)"相同
从而:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
Run Code Online (Sandbox Code Playgroud)
变为:
IF not [%var%] == [1] IF not [%var%] == [2] ECHO FALSE
Run Code Online (Sandbox Code Playgroud)
即使这个问题有点老了:
如果你想使用if cond1 or cond 2- 你不应该使用复杂的循环或类似的东西.
简单地提供ifs彼此结合后goto- 这是隐含的或.
//thats an implicit IF cond1 OR cond2 OR cond3
if cond1 GOTO doit
if cond2 GOTO doit
if cond3 GOTO doit
//thats our else.
GOTO end
:doit
echo "doing it"
:end
Run Code Online (Sandbox Code Playgroud)
如果没有goto但是"inplace"动作,如果所有条件都匹配,你可以执行3次动作.
可以在一行中使用简单的“ FOR”以使用“或”条件:
FOR %%a in (item1 item2 ...) DO IF {condition_involving_%%a} {execute_command}
Run Code Online (Sandbox Code Playgroud)
适用于您的情况:
FOR %%a in (1 2) DO IF %var%==%%a ECHO TRUE
Run Code Online (Sandbox Code Playgroud)