windows - 如果...或如果...在 Windows 批处理文件中

标签 windows batch-file if-statement cmd conditional

有没有办法在 Windows 批处理文件中编写 IF OR IF 条件语句?

例如:

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE

最佳答案

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 的当前值的 block 中进行测试

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=”这样的选项

通过添加更多代码,即使在 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 选项。

关于windows - 如果...或如果...在 Windows 批处理文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8438511/

相关文章:

windows - 检查带有模式的文件是否存在

java: 一长串条件,怎么办?

python - 迭代循环以更改条件语句,python

java - 检查字符串中的一组特定字符(密码)

c# - 如何在 C# 中指定非精确路径

windows - 使用 dpiawareness=1 时辅助监视器的坐标很奇怪

windows - 在 Windows 上使用 OpenBLAS 安装 numpy 的教程

c++ - 多个 Nt 函数在 Windows 7 x32 上返回 STATUS_WAIT_0

windows - 如何使用批处理文件捕获 Windows 硬件配置?

javascript - 从javascript运行一个bat文件