找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31295|回复: 10

[特效代码] [已解决] 批处理如何利用md5检查两个文件的一致?

[复制链接]
发表于 2011-8-15 21:57:39 | 显示全部楼层 |阅读模式
本帖最后由 zcop20 于 2011-8-15 22:29 编辑

md5.exe工具使用这个:http://www.fourmilab.ch/md5/md5.zip

通常为(例):
C:\>md5.exe "D:\文件A.rar"
345C0D0106233189C09F3B9E15B0D079  D:\文件A.rar


本来想利用 %str:~0,32% 命令来对照两个文件md5的一致性,
文件一致时执行 echo verify check ok,不一致时执行 echo verify check error
但又不知道如何将md5数值加到变量中....
若是有其他好的办法可以达到目的也是可以的(只要不要使用输出文件\文本的方式来比较md5)

感谢各位

评分

参与人数 1PB +2 收起 理由
CrLf + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-8-15 22:07:27 | 显示全部楼层
举个例子,也许你就懂了:
  1. for /f %%a in ('md5.exe "D:\文件A.rar"') do set md5=%%a
  2. echo %md5%
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2011-8-15 22:28:36 | 显示全部楼层
感谢版主 ^^
 楼主| 发表于 2011-8-16 09:20:25 | 显示全部楼层
发现一个新问题: 当目录存在括号等怎么办?把右括号后边的给忽略了....

比如:
for /f %%a in ('"%~dp0md5.exe" D:\新建文件夹 (3)\文件A.rar') do set md5a=%%a

会提示:
此时不应有 \文件A.rar')。

若给文件A路径加双引号""也不对:
'D:\新建文件夹' 不是内部或外部命令,也不是可运行的程序或批处理文件。
发表于 2011-8-16 19:26:14 | 显示全部楼层
回复 4# zcop20


试试转义:
D:\新建文件夹 ^(3^)\文件A.rar
 楼主| 发表于 2011-8-16 20:25:23 | 显示全部楼层
回复 5# CUer


    感谢指点

但是这对于空格路径又不行了...
D:\新建文件夹^(3^)\文件A.rar   ---可以
D:\新建文件夹 ^(3^)\文件A.rar  ---不行
发表于 2011-8-16 20:32:31 | 显示全部楼层
回复 6# zcop20


再加上双引号呢?
 楼主| 发表于 2011-8-16 21:21:59 | 显示全部楼层
回复 7# CUer


   双引号试过的 不行...
'D:\新建文件夹' 不是内部或外部命令,也不是可运行的程序或批处理文件。

测试的路径是 D:\新建文件夹 (3)
发表于 2011-8-17 09:44:00 | 显示全部楼层
中文字符 有问题

试试纯字母
 楼主| 发表于 2011-8-17 10:25:57 | 显示全部楼层
回复 9# andyrave


本来是想用 "%~dp0md5.exe" "%~dp0文件A.rar" 做个批处理,
用以应对将批处理文件、md5.exe、要校验的文件A 三者同时放在任意目录都能校验
没想到被路径所限了
发表于 2011-8-17 10:46:05 | 显示全部楼层
本帖最后由 CrLf 于 2011-8-17 10:47 编辑

回复 4# zcop20

for /f 从命令获取输入时有个特性,当发现参数首尾都存在双引号时,会自动把它去掉再执行,所以那句可以改成:
  1. for /f %%a in ('@"%~dp0md5.exe" "D:\新建文件夹 ^(3^)\文件A.rar"') do set md5a=%%a
  2. ::用 @ 避免以双引号打头,而又符合语法,这应该是最优方案
复制代码
当然还有其他方案,不过都有明显缺点:
  1. for /f %%a in ('^>con "%~dp0md5.exe" "D:\新建文件夹 ^(3^)\文件A.rar"') do set md5a=%%a
  2. ::同样的原理,只是这里改用重定向,缺点是不够简洁
复制代码
  1. for /f %%a in ('""%~dp0md5.exe" "D:\新建文件夹 ^(3^)\文件A.rar""') do set md5a=%%a
  2. ::多给一对双引号,不过这样一来反括号就跑到引号对之外了,需要另行转义
复制代码
或者
  1. for /f %%a in ('call "%~dp0md5.exe" "D:\新建文件夹 ^(3^)\文件A.rar"') do set md5a=%%a
  2. ::因为此处使用了 call 来,效率会降低至少三分之一
复制代码
  1. "%~dp0md5.exe" "D:\新建文件夹 (3)\文件A.rar"|for /f %%a in ('more') do set md5a=%%a
  2. ::缺点和 call 一样,用时至少多一半
复制代码
再或者
  1. for /f %%a in ('%~dps0md5.exe "D:\新建文件夹 (3)\文件A.rar"') do set md5a=%%a
  2. ::使用短名,避免绝对路径中存在空格的情况,但是若存在特殊字符 ) 将导致for命令出错,而若存在 &,后果不堪设想
复制代码

评分

参与人数 1技术 +1 收起 理由
zcop20 + 1 完美解决问题! 太棒了! 列举的其他方案也值 ...

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 23:47 , Processed in 0.023708 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表