2017-09-18 36 views
0

我使用Windows批处理文件比较2个文件夹中的文件列表。它打印结果是否通过/失败。如何获得FOR LOOP中每个命令的ERRORLEVEL?

当前工作批处理文件:

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

如果有3个文件,运行此命令后的输出应该是这样的:

PASS 
FAIL 
PASS 

如果我在这里交相辉映%ERRORLEVEL% ,它会返回0,因为for循环运行良好。

echo %ERRORLEVEL% 

0 

我的要求

响彻每一个命令,而不是循环的结果。

我的预期输出

0 
1 
0 

如何更改批处理文件来实现这一目标?

回答

1

假设FAIL改变ERRORLEVEL,使用&呼应ERRORLEVEL每个命令:

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

OUTPUT:

PASS 
0 
FAIL 
1 
PASS 
0 

我认为PASS/FAIL是你compare实用程序的输出。为了隐藏这个输出重定向使用到>NUL这样的:

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

OUTPUT:

0 
1 
0 

documentation

&:命令1 &命令2

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

+1

这是行不通的,因为:1.您需要[延迟扩展](http://ss64.com/nt/delayedexpansion.html)来获得Error!ity!的ErrorLevel;否则,返回读取整个命令行时出现的ErrorLevel; 2. ['&&'](http://ss64.com/nt/syntax-conditional.html)可以防止返回非零的ErrorLevels,您必须使用'&'; – aschipfl

+0

@aschipfl,对不起,俯瞰。我已经更新了答案并添加了文档。感谢您指出。 – sohaib

+0

我试过了。获取下面的输出: PASS !ERRORLEVEL! 失败 !ERRORLEVEL! PASS !ERRORLEVEL! – InsecureNoob