如何使用cmd在2个文件夹路径中递归地对文件进行二进制比较?

如何使用cmd在2个文件夹路径中递归地对文件进行二进制比较?,cmd,command-prompt,Cmd,Command Prompt,我需要编写一个脚本,递归地对2个文件夹中的所有文件进行二进制比较。这两个文件夹是安装文件夹,包含相同的文件,但它们是不同版本的安装文件夹。我需要找到哪些文件(.dll,.lib,.exe)与以前的版本相比发生了更改 我已尝试使用fc命令 fc /b %1\* %2\* > result.txt 但是,它只比较指定文件夹中的文件。我需要递归地比较所有文件夹中的所有文件 我认为这可以通过for循环来实现 For /r C:\test\%%f in (*) do @fc /b %%f C:\

我需要编写一个脚本,递归地对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"

<代码> @ RealPuth在路径中间引入<代码> \\/COD>,这扰乱了我的完整路径。任何关于这一点的建议都将不胜感激


请帮忙

这是一个需要使用第三方工具的解决方案,但它非常有效

您将需要获得—它只是20KB的可执行文件

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

md5deep -l -r dir1 > old.txt
e7c3fcf5ad7583012379ec49e9a47b28  .\a\file1.bin
2ef76c2ecaefba21b395c6b0c6af7314  .\b\file2.bin
45e19bb4b38d529d6310946966f4df12  .\c\file3.bin
...
结果保存在
old.txt
中,如下所示:

md5deep -l -r dir1 > old.txt
e7c3fcf5ad7583012379ec49e9a47b28  .\a\file1.bin
2ef76c2ecaefba21b395c6b0c6af7314  .\b\file2.bin
45e19bb4b38d529d6310946966f4df12  .\c\file3.bin
...
然后,在负匹配模式下对第二个目录运行它:

md5deep -l -r -X old.txt dir2
它将打印第二个目录中与原始目录不同的所有文件的校验和名称

您还可以在标准校验和模式下对seconddir运行它,并自己比较结果


无论如何,我怀疑你是否可以仅仅使用
cmd
:你必须用更高级的语言编写一些东西,比如C/C++/C#/whatever。

一种解决方法是使用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命令输出(长):

我的最终代码:-

@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命令将逐行作为输入,一旦找不到字符串,它就会退出,尽管我不确定。
这是一个非常常见的问题,但我仍然无法在网上找到解决方案,这就是为什么我在这里发布它

谢谢你的帮助。我猜任务很小,这个脚本将被反复使用。我认为这项任务只能通过cmd的几行脚本来完成。使用一个额外的软件似乎不是一个明智的选择。我个人认为您低估了这一点的复杂性,以及md5deep可以为您节省多少精力,特别是考虑到将来的维护,如果文件列表发生变化的话。当然,这取决于你。md5deep是解决我问题的完美方法。谢谢mvp!很好的解决方案,但是这里没有处理带空格的文件夹/文件名。谢谢。@vik001ind:你试过在
FC
通话中的名字周围加双引号吗?太好了!它工作顺利。谢谢安德烈和用户2033427。我又添加了两行用于删除虚拟驱动器,即subst Y:/D。如果fc命令出现一个差异,是否可以使其静音?这将节省我大量的时间。我在(*)do fc/lb1/b“%%f”“Z:%%~pnxf”中尝试了>for/r Y:%%f,但这仍然检查所有差异。我还考虑使用errorlevel自定义错误消息,我只想打印不匹配的文件名。添加了subst y:/d部分。也许明天我有更多的时间,可能需要一些更复杂的东西,@vik001ind处理fc命令输出,并在得到一个差异后使其安静下来。