[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[特效代码] [已解决] 批处理如何利用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)

感谢各位
1

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 2

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

评分人数

    • zcop20: 完美解决问题! 太棒了! 列举的其他方案也值 ...技术 + 1

TOP

回复 9# andyrave


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

TOP

中文字符 有问题

试试纯字母
测试环境:WINDOWS 8 64Bit
如系统环境不同,请自行修改 :)

TOP

回复 7# CUer


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

测试的路径是 D:\新建文件夹 (3)

TOP

回复 6# zcop20


再加上双引号呢?

TOP

回复 5# CUer


    感谢指点

但是这对于空格路径又不行了...
D:\新建文件夹^(3^)\文件A.rar   ---可以
D:\新建文件夹 ^(3^)\文件A.rar  ---不行

TOP

回复 4# zcop20


试试转义:
D:\新建文件夹 ^(3^)\文件A.rar

TOP

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

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

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

若给文件A路径加双引号""也不对:
'D:\新建文件夹' 不是内部或外部命令,也不是可运行的程序或批处理文件。

TOP

感谢版主 ^^

TOP

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

评分人数

TOP

返回列表