【问题标题】:Windows BAT - IF statement fails in FOR loopWindows BAT - IF 语句在 FOR 循环中失败
【发布时间】:2012-06-28 22:45:54
【问题描述】:

所以我一直试图弄清楚这一点,但没有任何结果。我已经把它缩小到一个小案例,所以请告诉我你的想法。

我有一个文件目录(1-a.txt 和 1-b.txt)和一个批处理文件,如下所示:

for %%X in (1) do ^
fc %%X-a.txt %%X-b.txt > tmp.txt &^
if errorlevel 0 (echo 5) else (echo 6) &^
echo 7

基本上,如果文件相同,我希望它回显 5,如果文件不同,我希望它回显 6、7。 但是,它总是回显 5。回显 7 被完全忽略。

有什么想法吗?

【问题讨论】:

  • 经验法则 - 如果您发现自己需要不止一个简单的循环...或任何类型的控制结构或数据操作...然后运行!不要走……到最近的脚本语言。 Powershell、Perl、VBscript ... 除了 .bat 文件之外的任何东西。恕我直言...
  • 我知道,但我只是想增加我的知识并成为一个更好的程序员;D

标签: windows if-statement for-loop batch-file


【解决方案1】:

if errorlevel 在错误级别为至少 0 时为真。它总是大于或等于 比较:

C:\>help if
Performs conditional processing in batch programs.

...

  ERRORLEVEL number Specifies a true condition if the last program run
                    returned an exit code equal to or greater than the number
                    specified.

通常你可以直接切换分支:

if errorlevel 1 (echo 6) else (echo 5)

在您的情况下,我还建议您使用括号对语句进行分组:

for %%X in (1) do (
  fc %%X-a.txt %%X-b.txt > tmp.txt
  if errorlevel 1 (echo 6) else (echo 5)
  echo 7
)

作为程序调用后显式if 的另一种选择,还有一些运算符根据前一个命令的结果运行另一个命令:

fc %%X-a.txt %%X-b.txt > tmp.txt && echo 5 || echo 6

【讨论】:

  • 很酷,谢谢!知道为什么我的“echo 7”从未在以前的 .bat 脚本中运行过吗?
  • 您的 if 语句的格式为“if a then b else c & d”。这被解释为“if a then (b) else (c & d)”。只有当 a 为 false 时才会执行 d 语句,而事实并非如此。如果您将 if 语句放在括号中,则 echo 7 会运行:“(if errorlevel 0 (echo 5) else (echo 6)) & echo 7”
猜你喜欢
  • 2016-06-16
  • 2019-06-09
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多