中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-03 13:42
48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » [原创]用批处理方式实现的目录比较工具
可打印版本  1,948 / 15
第1楼 rubble 发表于 2009-05-07 21:27
初级用户 发帖 15 积分 23
[原创]用批处理方式实现的目录比较工具
下载链接:
http://upload.cn-dos.net/img/1478.zip
更新日志:
v4:
1.增加了计算的进度显示;
2.找了新版的 md5sum.exe,没有对动态库的依赖。

工具一:md5comv4.bat 接受两个目录参数,计算两个目录里每个文件的 md5 值,并给出报表文件 md5v4.txt,使用方法:
md5omv4.bat <目录1> <目录2>

根据这 md5comv4.bat 生成的报表文件 md5v4.txt,可以找到两个目录中
1:同名而且 md5 相同的文件;
2:同名但是 md5 不同的文件;
3:不同名但是 md5 相同的文件;
4:同一目录中不同名但是 md5 相同的文件。

注意事项:
1:md5comv4.bat 不接受路径带有空格的目录名,但是可以接受带有空格的文件名;
2:md5 的计算由 md5sum.exe 完成;
3:md5comv4.bat 运行时会产生大量临时文件,这些文件由工具自动维护,不必手工清理。

这个工具都是命令行方式、文本界面的,对于习惯使用图形界面的朋友来说,可能不方便,因此,不推荐习惯使用图形界面的朋友使用。
有问题请写邮件到 rubble@126.com
文件已上传到论坛的上传系统,
檔名 用戶 備註 大小 日期 原檔名
rubble 目录比较工具,基于md5sum实现。 33kB 2009/05/08(Fri)17:20 目录比较工具.zip
下载链接:
http://upload.cn-dos.net/img/1478.zip

[ Last edited by rubble on 2009-5-13 at 01:34 ]
第2楼 rubble 发表于 2009-05-07 21:31
初级用户 发帖 15 积分 23
疏漏
最近几天一直在论坛泡着,看了一些高手写的BAT程序,发现了这个工具的一个不足之处:每行批处理命令后面,特别是带有截取字符串的命令的行的后面,不能有多余的空格。
第3楼 rubble 发表于 2009-05-07 21:36
初级用户 发帖 15 积分 23
如何引用
Sample Text如何引用

Sample Text如何引用
第4楼 rubble 发表于 2009-05-07 21:39
初级用户 发帖 15 积分 23
如何引用
代码列表如下,有一些特殊字符可能不能被正常显示,请到上传系统下载源文件:




[ Last edited by rubble on 2009-5-7 at 21:44 ]
第5楼 HAT 发表于 2009-05-07 23:18
版主 发帖 5,017 积分 9,023
没有仔细看代码,能说说问什么不接受路径带有空格的目录名吗?
第6楼 rubble 发表于 2009-05-08 03:41
初级用户 发帖 15 积分 23
不能带有空格的原因
为了正确处理带有空格的路径,要在给这样的路径加上双引号,而且即使加无数层双引号,也可以被命令正确处理。我想要的一种结果是,可以把参数中的所有的引号去掉,需要的时候我自己加上,以保证输出格式是固定的。这个目录比较工具的结果,格式是固定的,可以写C程序做进一步的处理。根据for命令的帮助,

这是简体中文xp和2003的帮助,下面是英文帮助:

然而实际实验时,只能去掉最外层的双引号,这不是我想要的,这可能会引起在结果文件中出现一堆双引号括着一个路径的情形。所以,最好不要在路径中带有空格。
第7楼 HAT 发表于 2009-05-08 11:57
版主 发帖 5,017 积分 9,023
Re 6楼
为何会产生无数层双引号?
能否把它们删除?比如:
第8楼 rubble 发表于 2009-05-08 22:14
初级用户 发帖 15 积分 23
太棒了!
Originally posted by HAT at 2009-5-8 11:57:
为何会产生无数层双引号?
能否把它们删除?比如:


太棒了,这个就是我想要的。我再改一下代码。
为何会产生无数层双引号?

呵呵,会产生2层或3层。还有一种情况,就是处理非法参数的情况,如果用户输入一层层的双引号,没有路径,只有双引号,像这样

你不把双引号去掉,就没有办法知道,用户输入的是非法路径。

[ Last edited by rubble on 2009-5-8 at 22:24 ]
第9楼 anxd 发表于 2009-05-11 02:38
新手上路 发帖 4 积分 4
太复杂了,来个简单的,遍历全目录文件比较,支持空格
@echo off
setlocal enableextensions enabledelayedexpansion

set dira=%~1
set dirb=%~2
if "%1" == "" (
echo 使用说明:请在命令行参数上指明两个目录,或在这里按提示输入。
echo 命令行参数格式:批处理名 ^<目录1^> ^<目录2^>
echo.
set /p dira=请输入第一个目录的名字(可拖放并输入回车):
)
echo.
if "%2" == "" (
echo 使用说明:请在命令行参数上指明两个目录,或在这里按提示输入。
echo 命令行参数格式:批处理名 ^<目录1^> ^<目录2^>
echo.
set /p dirb=请输入第二个目录的名字(可拖放并输入回车):
)

if "%dira%" == "" exit /b
if "%dirb%" == "" exit /b
rem 保留原执行路径
for /f %%a in ('cd') do (set mypath=%%a)

rem 映射目录1
subst k: /d >nul
subst k: %dira%
if exist "%mypath%\dira.txt" del %mypath%\dira.txt /q
k:
for /f "delims=" %%a in ('dir /s /b /a:-d /O:N') do (
%mypath%\md5sum "%%a" >>%mypath%\dira.txt
)
rem 回原执行目录
for /f "delims=\" %%a in ('echo %mypath%') do %%a
rem 映射目录2
subst k: /d
subst k: %dirb%
if exist "%mypath%\dirb.txt" del %mypath%\dirb.txt /q
k:
for /f "delims=" %%a in ('dir /s /b /a:-d /O:N') do (
%mypath%\md5sum "%%a" >>%mypath%\dirb.txt
)
rem 回原执行目录
for /f "delims=\" %%a in ('echo %mypath%') do %%a

sort dira.txt >dira.tmp
sort dirb.txt >dirb.tmp

fc %mypath%\dira.tmp %mypath%\dirb.tmp
第10楼 rubble 发表于 2009-05-12 02:33
初级用户 发帖 15 积分 23
改进的目录比较工具版本5
第11楼 anxd 发表于 2009-05-12 05:46
新手上路 发帖 4 积分 4
不用映射驱动器的做法不行啊
无论如何也得想法腾出个盘符替代两个目录名在生成文件中产生的差异,否则前面MD5相同,后面因目录名不同,FC会认为记录不匹配。
不用盘符,也可考虑生成文件后,将各自目录名统一一下(引入fr,那样做比subst复杂,而且可能影响到子目录与主目录同名的记录),再作比较。
第12楼 rubble 发表于 2009-05-12 08:04
初级用户 发帖 15 积分 23
也可以分析 md5sum 输出的结果
Originally posted by anxd at 2009-5-12 05:46:
无论如何也得想法腾出个盘符替代两个目录名在生成文件中产生的差异,否则前面MD5相同,后面因目录名不同,FC会认为记录不匹配。
不用盘符,也可 ...

也可以分析 md5sum 输出的结果,只记录 md5 值和该 md5 值对应的文件名,这样就没有目录不同的问题了。但是会有另一个问题,就是只知道有文件md5值不同,不知道文件在哪个目录里。要想知道,还要再找。
还有,请教一下,fr 是什么?
第13楼 anxd 发表于 2009-05-13 00:53
新手上路 发帖 4 积分 4
fr - 在文件中批量查找并替换匹配的字符串
http://upload.cn-dos.net/img/1282.rar

因为dir 带参数/b和/s情况下输出全路径名,所以md5sum输出结果是md5 值对应的文件带全路径名,有目录不同的问题了.
第14楼 rubble 发表于 2009-05-13 01:25
初级用户 发帖 15 积分 23
第 6 次更新


另外,没有用第三方的工具 fr.exe,其实有好多 gnu 工具可以实现比较强大的功能,用了之后不方便,用 md5sum.exe 是不得已。

[ Last edited by rubble on 2009-5-14 at 01:44 ]
第15楼 anxd 发表于 2009-05-13 03:06
新手上路 发帖 4 积分 4
补充
原句 for /f "tokens=1 delims= " %%b in ('md5sum %%a') do set md5val=%%b
加引号改为
for /f "tokens=1 delims= " %%b in ('md5sum “%%a”') do set md5val=%%b
这样输入框拖入带空格的主目录不会有问题。

感觉目录去的太干净,不利于快速定位,如果在最后比较结果中还原各自绝对路径,会更完善些,也会让比较结果具有让其他程序继续使用的价值。

因为我的数据备份工作需要知道与上次备份相比新增和更新的文件并对这些文件进行相关分析,楼主的贴对我帮助很大,在这表示感谢。
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023