2013-02-07 105 views
1

我給自己寫一個批處理文件的一個簡單的任務,將做以下對比文件:批:使用CRC32

比較每個文件的CRC32在「第一」文件夾中的「第二」文件夾中的每個文件。輸出需要是「第一個」文件夾中每個文件的名稱,該文件夾在「秒」中沒有重複。

注意:「CRC32.exe -nf」在第一行輸出CRC32,在第二行輸出CRC32。

這裏是我試圖做到這一點:

@echo off 

for %%i in ("%cd%\first\*.*") do (
    set uniq=0 
    for /f %%x in ('crc32 %%i -nf') do (
     set one=%%x 
     goto find_two 
    ) 
    :find_two 
    for %%j in ("%cd%\second\*.*") do (
     for /f %%x in ('crc32 %%j -nf') do (
      set two=%%x 
      goto compare 
     ) 
     :compare 
     if one==two (
      goto next 
     ) else (
      set uniq=1 
     ) 
    ) 
    if uniq==1 (
     echo %%i >>result.txt 
    ) 
    :next 
) 

我認爲不存在這個代碼的幾個錯誤,但我已經很難找到他們。所以如果有人有時間,並且認爲他能幫忙,我會很感激。

如果您認爲需要採用不同的方法,請隨時展示。

回答

0

有兩個主要問題。

Goto的內部托架不能按預期工作,他們立即停止循環,所以你的代碼將會在那裏失敗。
解決的辦法是避免goto或調用函數並在那裏使用goto

第二個問題是比較。
if one==two (將始終爲假,因爲它將單詞one與單詞two相比較,但不包括變量的內容。

通常情況下,您會使用if "%one%"=="%two%" echo equal,但由於它應該在括號內工作,所以您需要延遲擴展,所以它看起來像。

if !one!==!two! echo equal 

不要忘記啓用延遲擴展你開始

setlocal EnableDelayedExpansion 
+0

我使用'goto'的唯一原因是因爲在C++中沒有'break',但我不知道它不僅會打破嵌套循環,而且會破壞所有循環。我已根據您的指示修改了腳本,現在它看起來像這樣:[link](http://pastebin.com/raw.php?i=efbhNmV7)。但我仍然得到與以前一樣的錯誤:「_)此時不是預期的。」 – eqagunn

+0

刪除括號中的所有標籤,應解決此問題 – jeb

+0

感謝您的幫助jeb。感謝你,我意識到,擺脫嵌套循環是主要問題,我搜索並發現如何去做。這就是代碼現在的樣子,它的工作原理如下:[link](http://pastebin.com/raw.php?i=a1Bsm1TK) – eqagunn

0

循環之前可能會更容易使用這樣的捕捉到CRC32的輸出:

for /f %%x in ('crc32 "%filename%" -nf ^| find /v "CRC32"') do stuff with %%x 

如果這沒有幫助,你能告訴我一個例子crc32的完整輸出嗎?