如何在FOR循环中获取每个命令的ERRORLEVEL?

3

我将使用Windows批处理文件比较两个文件夹中的文件列表,并打印结果 PASS/FAIL。

当前工作的批处理文件:

for /F "tokens=*" %%f in (list.txt) do compare Folder1\%%f.png Folder2\%%f.png

如果有三个文件,则运行该命令后的输出结果将如下所示:
PASS
FAIL
PASS

如果我在这里输出%ERRORLEVEL%,它将返回0,因为for循环运行正常。
echo %ERRORLEVEL%

0

我的需求

在 FOR 循环中,仅回显每个命令的结果。

我期望的输出

0
1
0

我该如何更改批处理文件来实现这个目标?
1个回答

4

假设FAIL会改变ERRORLEVEL,使用&为每个命令输出ERRORLEVEL

SETLOCAL EnableDelayedExpansion
for /F "tokens=*" %%f in (list.txt) do compare Folder1\%%f.png Folder2\%%f.png & echo !ERRORLEVEL!
ENDLOCAL

输出:

PASS
0
FAIL
1
PASS
0

我假设“PASS/FAIL”是您的“比较”实用工具的输出。要隐藏此输出,请使用重定向符“>”将其重定向到“NUL”,如下所示:
SETLOCAL EnableDelayedExpansion
for /F "tokens=*" %%f in (list.txt) do compare Folder1\%%f.png Folder2\%%f.png > NUL & echo !ERRORLEVEL!
ENDLOCAL

输出:

0
1
0

根据文档:

& :command1 & command2

用于在一个命令行中分隔多个命令。Cmd.exe先运行第一个命令,然后再运行第二个命令。


1
这是行不通的,因为:1. 你需要使用延迟扩展来获取迭代的ErrorLevel,否则会返回读取整个命令行时存在的ErrorLevel;2. &&会阻止非零的ErrorLevel被返回,你必须使用& - aschipfl
@aschipfl,抱歉我疏忽了。我已经更新了答案,并且添加了文档。谢谢你的指出。 - sohaib
我尝试了这个。得到以下输出: 通过 !ERRORLEVEL! 失败 !ERRORLEVEL! 通过 !ERRORLEVEL! - AutoTester999
@InsecureNoob,显然你忘记启用延迟扩展了... - aschipfl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接