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

[文件操作] 批处理不用第三方工具实现文件校验码的核对

[复制链接]
发表于 2022-6-22 14:19:36 | 显示全部楼层 |阅读模式
支持码长为 16、32、40、64、96、128位
使用方式:
Hash_Check.cmd Check_file.md5 [Disp_ID]
Check_file.md5        输入文件,必须符合核验文档的相关标准
Disp_ID                输出控制,只有在数据量很大时有用,缺省时显示全部数据
示例:
Hash_Check.cmd "d:\test\test.SHA128"

将以下文字以ANSI的格式保存为“Hash_Check.cmd”
  1. @echo off
  2. @rem MD5_16        16
  3. @rem MD5        32
  4. @rem SHA1        40
  5. @rem SHA256        64
  6. @rem SHA384        96
  7. @rem SHA512        128

  8. setlocal enabledelayedexpansion

  9. @rem 显示指令状态
  10. echo;正在执行:&&echo;"%~0" "%~1" &&echo;

  11. @rem 初始化扩展名支持列表
  12. for /f "delims==" %%a in ('set ext_[ 2^>nul') do set "%%a="
  13. set "ext_[.MD5]=True"
  14. set "ext_[.SHA]=True"
  15. set "ext_[.SHA1]=True"
  16. set "ext_[.SHA128]=True"
  17. set "ext_[.SHA256]=True"
  18. set "ext_[.SHA384]=True"
  19. set "ext_[.SHA512]=True"
  20. set "ext_[.MD5SUM]=True"
  21. set "ext_[.MD5SUMS]=True"
  22. set "ext_[.SHA1SUMS]=True"
  23. set "ext_[.SHA256SUMS]=True"
  24. set "ext_[.SHA512SUMS]=True"

  25. @rem 检查数据文件类型是否为本脚本所支持
  26. call set "ext_Code=%%ext_[%~x1]%%"
  27. if not defined ext_Code (
  28.         echo;
  29.         echo;不支持的数据文件扩展名:%~x1 (脚本只支持扩展名为以.sha或.md5开头的数据文件,如:"d:\test\test.SHA128")
  30.         goto :ExitBatch
  31. )

  32. @rem 初始化本脚本支持的Hash类型
  33. for /f "delims==" %%a in ('set sha_[ 2^>nul') do set "%%a="
  34. set "sha_[16]=MD5"
  35. set "sha_[32]=MD5"
  36. set "sha_[40]=SHA1"
  37. set "sha_[64]=SHA256"
  38. set "sha_[96]=SHA384"
  39. set "sha_[128]=SHA512"

  40. @rem 初始化计数器
  41. set /a "FilesNo=0"
  42. set /a "File1No=0"
  43. set /a "FilesEr=0"
  44. set /a "File1Er=0"
  45. set /a "Hash0Er=0"
  46. set /a "Hash1Er=0"
  47. set /a "Folders=0"

  48. @rem 初始化strlen函数内敛到变量_strlen中,用于测试字符串长度(0~8K);入口参数#1,返回变量##
  49. set "_strlen=set $=^!#1^!#&set ##=&(for %%z in (4096 2048 1024 512 256 128 64 32 16)do if ^!$:~%%z^!. NEQ . set/a##+=%%z&set $=^!$:~%%z^!)&set $=^!$^!fedcba9876543210&set/a##+=0x^!$:~16,1^!"

  50. @rem 初始化校验有效数据的输出状态:存在参数2(%2)则不输出,反之则输出
  51. if "[%~2]"=="[]" (set "Ef_Disp_ID=True") else (set "Ef_Disp_ID=")

  52. @rem 切换for指令的默认工作文件夹
  53. cd /d %~dp1

  54. @rem 用for指令读取数据:忽略"#"开头的行,每行只切为2段,其分隔符为"* "(放置在最后可实现"空格与星号任意组合")。
  55. for /f "usebackq eol=# tokens=1,* delims=* "  %%a in ("%~1") do (
  56.         set /a FilesNo+=1
  57.         set "ListNo=    !FilesNo!."
  58.         set "ListNo=!ListNo:~-5!
  59.         set "Dir_a=%%~ab"
  60.         if not defined Dir_a (
  61.                 echo;!ListNo!"%%~fb" 文件不存在(×)
  62.                 set /a FilesEr+=1
  63.         ) else if "[!Dir_a:~0,1!]"=="[d]" (
  64.                 echo;!ListNo!"%%~fb" 是文件夹,忽略(×)
  65.                 set /a Folders+=1
  66.         ) else (
  67.                 set #1=%%~a
  68.                 (%_strlen%)
  69.                 @rem 获取Hash类型
  70.                 call set "sha_Code=%%sha_[!##!]%%"
  71.                 if defined sha_Code for /f "usebackq tokens=*" %%z in (`certutil -hashfile "%%~fb" !sha_Code!`) do (
  72.                         set "Hash_Code=%%z"
  73.                         if /i "[!Hash_Code:~0,26!]"=="[CertUtil: -hashfile 失败: 0x]" (
  74.                                 echo;!ListNo!"%%~fb" 在执行 `certutil -hashfile "%%~nxb" !sha_Code: =!` 时出错(×)
  75.                                 set /a File1Er+=1
  76.                         )
  77.                         if "[!Hash_Code!]"=="[!Hash_Code::=!]" (
  78.                                 set "Hash_Code=%%z"
  79.                                 set "Hash_Code=!Hash_Code: =!"
  80.                                 if "[!##!]"=="[16]" (
  81.                                         set "Hash_Code=!Hash_Code:~8,16!"
  82.                                         set "Check_code=MD5_16"
  83.                                 ) else (
  84.                                         set "Check_code=!sha_Code!"
  85.                                 )
  86.                                 if /i "[!Hash_Code!]"=="[%%~a]" (
  87.                                         if defined Ef_Disp_ID echo;!ListNo!"%%~fb" (!Check_code!)有效,列示如下:!Hash_Code!
  88.                                         set /a File1No+=1
  89.                                 ) else (
  90.                                         echo;!ListNo!"%%~fb" (!Check_code!)无效(×),实测如下:!Hash_Code!(%%~a)
  91.                                         set /a Hash1Er+=1
  92.                                 )
  93.                         )
  94.                 ) else (
  95.                         echo;!ListNo!"%%~a" (!##!位)HasH码长度不符(16、32、40、64、96、128)(×)
  96.                         set /a Hash0Er+=1
  97.                 )
  98.         )
  99. )

  100. echo;
  101. echo;共扫描Hash码 %FilesNo% 个
  102. echo;其中有 %File1No% 个文件HasH码校验有效(√)
  103. if %Hash1Er% GTR 0 echo;    有 %Hash1Er% 个HasH码校验无效(×)
  104. if %Hash0Er% GTR 0 echo;    有 %Hash0Er% 个HasH码长度不符(×)
  105. if %FilesEr% GTR 0 echo;    有 %FilesEr% 个文件不存在(×)
  106. if %File1Er% GTR 0 echo;    有 %File1Er% 个文件HasH校验过程出错(×)
  107. if %Folders% GTR 0 echo;    有 %Folders% 行被忽略(×)

  108. :ExitBatch
  109. endlocal
  110. echo;
  111. echo;脚本执行结束,请按任意键退出
  112. pause>nul
  113. exit /b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 20:35 , Processed in 0.017233 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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