2017-09-18 88 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