zmbq 解决方案很好,但不能在所有情况下都使用,例如在 FOR DO(...) 循环之类的代码块内。
另一种方法是使用指示变量。将其初始化为未定义,然后仅当任何一个 OR 条件为真时才定义它。然后使用 IF DEFINED 作为最终测试 - 无需使用延迟扩展。
FOR ..... DO (
set "TRUE="
IF cond1 set TRUE=1
IF cond2 set TRUE=1
IF defined TRUE (
...
) else (
...
)
)
您可以添加 arasmussen 使用的 ELSE IF 逻辑,因为如果第一个条件为真,它的执行速度可能会快一点,但我从不打扰。
附录 - 这是一个重复的问题,与Using an OR in an IF statement WinXP Batch Script的答案几乎相同
最终附录 - 我几乎忘记了我最喜欢的测试变量是否是不区分大小写值列表中的任何一个的技术。初始化包含可接受值的分隔列表的测试变量,然后使用搜索和替换来测试您的变量是否在列表中。这非常快,并且对任意长的列表使用最少的代码。它确实需要延迟扩展(或者 CALL %%VAR%% 技巧)。该测试也不区分大小写。
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)
如果 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)
)
根据 VAR 中的预期值,可能需要像“delims=" 这样的 FOR 选项
通过添加更多代码,即使在 VAR 中使用=,上述策略也可以变得可靠。
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true
但是现在我们已经失去了提供 ELSE 子句的能力,除非我们添加一个指示变量。代码开始看起来有点“难看”,但我认为它是测试 VAR 是否是任意数量的不区分大小写选项中的任何一个的性能最好的可靠方法。
最后有一个更简单的版本,我认为它稍微慢一些,因为它必须为每个值执行一个 IF。 Aacini 在对前面提到的链接中接受的答案的评论中提供了这个解决方案
for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A echo true
值列表不能包含 * 或 ?字符,并且值和 %VAR% 不应包含引号。如果%VAR% 还包含空格或特殊字符(如^、& 等),则引号会导致问题。此解决方案的另一个限制是它不提供ELSE 子句选项,除非您添加指示变量。优点是它可以区分大小写或不区分大小写,具体取决于是否存在 IF /I 选项。