Board logo

标题: [特效代码] [已解决] 批处理如何利用md5检查两个文件的一致? [打印本页]

作者: zcop20    时间: 2011-8-15 21:57     标题: [已解决] 批处理如何利用md5检查两个文件的一致?

本帖最后由 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)

感谢各位
作者: CrLf    时间: 2011-8-15 22:07

举个例子,也许你就懂了:
  1. for /f %%a in ('md5.exe "D:\文件A.rar"') do set md5=%%a
  2. echo %md5%
复制代码

作者: zcop20    时间: 2011-8-15 22:28

感谢版主 ^^
作者: zcop20    时间: 2011-8-16 09:20

发现一个新问题: 当目录存在括号等怎么办?把右括号后边的给忽略了....

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

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

若给文件A路径加双引号""也不对:
'D:\新建文件夹' 不是内部或外部命令,也不是可运行的程序或批处理文件。
作者: CUer    时间: 2011-8-16 19:26

回复 4# zcop20


试试转义:
D:\新建文件夹 ^(3^)\文件A.rar
作者: zcop20    时间: 2011-8-16 20:25

回复 5# CUer


    感谢指点

但是这对于空格路径又不行了...
D:\新建文件夹^(3^)\文件A.rar   ---可以
D:\新建文件夹 ^(3^)\文件A.rar  ---不行
作者: CUer    时间: 2011-8-16 20:32

回复 6# zcop20


再加上双引号呢?
作者: zcop20    时间: 2011-8-16 21:21

回复 7# CUer


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

测试的路径是 D:\新建文件夹 (3)
作者: andyrave    时间: 2011-8-17 09:44

中文字符 有问题

试试纯字母
作者: zcop20    时间: 2011-8-17 10:25

回复 9# andyrave


本来是想用 "%~dp0md5.exe" "%~dp0文件A.rar" 做个批处理,
用以应对将批处理文件、md5.exe、要校验的文件A 三者同时放在任意目录都能校验
没想到被路径所限了
作者: CrLf    时间: 2011-8-17 10:46

本帖最后由 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命令出错,而若存在 &,后果不堪设想
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2