批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

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

支持码长为 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
复制代码

返回列表