2013-02-07 104 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的完整输出吗?