5

我需要编写一个脚本,以递归方式对 2 个文件夹中的所有文件进行二进制比较。这2个文件夹是安装文件夹,包含相同的文件,但它们是不同版本的安装文件夹。我需要找出哪些文件(.dll, .lib, .exe)相对于以前的版本发生了变化。

我试过使用fc命令

fc /b %1\* %2\* > result.txt 

但是,它只比较指定文件夹内的文件。我需要递归比较所有文件夹中的所有文件。

我认为这可以通过for循环来实现。

For /r C:\test\%%f in (*) do @fc /b %%f C:\test\%2\%%~nxf > result.txt  

这里的问题是%%~nxf它只给出文件名而不是相对路径。

我尝试使用forfiles命令:

forfiles /s /p C:\test\%1 /m * /c "cmd /c @fc /b %1\@relpath %2\@relpath"

@relpath在路径中间引入.\,这弄乱了我的完整路径。对此的任何指示都将受到高度赞赏。

请帮忙!

4

3 回答 3

6

这是解决方案需要使用 3rd-party 工具,但它非常有效。

您将需要获得md5deep - 它只有 20KB 的可执行文件。

然后,对第一个目录执行它,如下所示:

md5deep -l -r dir1 > old.txt

结果保存在old.txt其中,如下所示:

e7c3fcf5ad7583012379ec49e9a47b28  .\a\file1.bin
2ef76c2ecaefba21b395c6b0c6af7314  .\b\file2.bin
45e19bb4b38d529d6310946966f4df12  .\c\file3.bin
...

然后,针对第二个目录以否定匹配模式运行它:

md5deep -l -r -X old.txt dir2

它将打印第二个目录中与原始文件不同的所有文件的校验和和名称。

您还可以在标准校验和模式下针对第二个目录运行它并自己比较结果。

无论如何,我怀疑你是否能侥幸逃脱cmd:你将不得不用更高级的语言编写一些东西,比如 C/C++/C#/whatever。

于 2013-02-04T09:08:31.960 回答
3

我的最终代码:-

@echo off
set count=0
del /f result.txt
subst Y: %1
subst Z: %2
for /r Y: %%f in (*) do (fc /b "%%f" "Z:%%~pnxf" |  find "no diff" >nul
if ERRORLEVEL 1 echo "%1%%~pnxf is different" >> result.txt
set /a count+=1)

subst Y: /D
subst Z: /D


echo Total Files Compared = %count% 

一件事,我没有得到,这个脚本没有检查所有差异。一旦发现差异,它就会打印在结果页面上。这正是我想要的。我猜 find 命令逐行作为输入,一旦找不到字符串,它就会退出,尽管我不确定。这是一个非常普遍的问题,但我仍然无法在网上找到解决方案,这就是我在这里发布它的原因。

于 2013-02-06T04:06:50.180 回答
2

一种解决方法是使用 subst 将路径与驱动器号相关联,然后比较两者。例如:

subst Y: "C:\test 1"
subst Z: "C:\test 2"
for /r Y: %%f in (*) do fc /b "%%f" "Z:%%~pnxf"
subst Y: /d
subst Z: /d

希望这可以帮助

编辑:处理 fc 命令输出(长):

setlocal enabledelayedexpansion
subst Y: /d
subst Z: /d
pause
subst Y: "C:\test 1"
subst Z: "C:\test 2"
for /r Y: %%f in (*) do (
  set diff=1&for /f "tokens=1,2,3,4 delims= " %%i in ('fc /b "%%f" "Z:%%~pnxf"') do (
    if "%%i"=="Comparing" (echo.) else (
      if "%%k"=="longer" (echo LONGER   : %%j) else (
        if "%%i"=="FC:" echo NO DIFF  : %%f
        if "%%l"=="" (if "!diff!"=="1" (
          echo DIFFERENT: %%f
          echo %%i %%j %%k
          set diff=2
        ))
      )
    )
  )
)
subst Y: /d
subst Z: /d
于 2013-02-04T09:40:01.973 回答