【批处理】基于坛友的java编写md5校验工具而写了个md5、sha1、sha256批处理工具
## 提前策划灵感来源:
*[随便去取 - 【Java】MD5值对比辨别文件是否改动(出处: 吾爱破解论坛)](
https://www.52pojie.cn/thread-1809418-1-1.html)
* (https://msdn.itellyou.cn)(SHA1)
想法:
* 能不能更轻便用 batch/powershell 写一个(能用batch最好)
* 不止于md5,sha1、sha256行不行?
* https://www.ii.com/checksums/#_step_2_powershell_and_cmd_certutilcommand (参考)
设计/功能需求演化:
step1.计算文件的md5、sha1、sha256
step2.在第一步基础上拿到哈希值做两个文件的比较
step3. 复制一段哈希值比较下载文件(供应商提供的哈希值与网上下载的文件做比对)
## 源码与简单说明
附源码:https://github.com/hoochanlon/scripts/blob/main/d-bat/md5tools.bat
核心逻辑:
1. 使用基础的工具命令,结合`for /f "tokens=* delims=" ` 的整行处理,通过`skip=1`,跳过第一行取终端输出的第二行哈希值。
2. 基于上述方法再进行一次for循环,求其他sha1、sha256的值,将所有的值存入变量后,跳出循环体,依次做比较。
3. 在输入哈希值的比较与在计算文件哈希值的比较判断逻辑上:
1. 如果每个哈希相同,输出;如果都不同,else 哈希值不匹配。(缺陷:测试情况三者全一致,仍会走else)
2. 设置flag,使条件转向 set "match=false" 匹配则置true。(改善措施)
3. `set "match=false";if "%match%"=="false" (echo MD5、SHA1、SHA256哈希值全不匹配。)` (具体行为/代码)
```batch
@%1 C:\Windows\SysWOW64\mshta.exe vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit & cd /d "%~dp0"
@echo off
setlocal
:menu
echo.
echo ***********************************************
echo MD5、SHA1、SHA256 哈希值计算、比较、校验工具
echo.
echo by https://github.com/hoochanlon
echo.
echo 选项
echo . 计算文件 MD5、SHA1、SHA256 哈希值。
echo . 比较文件 MD5、SHA1、SHA256 哈希值。
echo . 校验文件 MD5、SHA1、SHA256 哈希值。
echo . 刷新,并返回菜单。
echo.
echo ***********************************************
echo.
goto :select
:select
set /p choice=请输入选项数字:
set "match=false"
if "%choice%"=="1" (
set /p filePath=请输入文件路径:
call :calcHash "%filePath%"
goto select
) else if "%choice%"=="2" (
set /p filePath1=请输入第一个文件路径:
set /p filePath2=请输入第二个文件路径:
call :compareHash "%filePath1%" "%filePath2%"
goto select
) else if "%choice%"=="3" (
set /p hashcode=请输入哈希值:
set /p filePathS=请输入文件路径:
call :jiaoyanHash "%hashcode%" "%filePathS%"
goto select
) else if "%choice%"=="4" (
cls
goto menu
) else (
echo 无效的选项。
goto menu
)
exit /b
:calcHash
rem 计算文件的 MD5、SHA1、SHA256 哈希值
for /f "skip=1 tokens=* delims=" %%a in ('certutil -hashfile %filePath% MD5') do (
set "md5Hash=%%a"
goto :calcMD5
)
:calcMD5
echo MD5 哈希值:%md5Hash%
for /f "skip=1 tokens=* delims=" %%a in ('certutil -hashfile %filePath% SHA1') do (
set "sha1Hash=%%a"
goto :calcSHA1
)
:calcSHA1
echo SHA1 哈希值:%sha1Hash%
for /f "skip=1 tokens=* delims=" %%a in ('certutil -hashfile %filePath% SHA256') do (
set "sha256Hash=%%a"
goto :calcSHA256
)
:calcSHA256
echo SHA256 哈希值:%sha256Hash%
echo.
exit /b
:compareHash
echo.
for /f "skip=1 tokens=* delims=" %%a in ('certutil -hashfile "%filePath1%" MD5') do (
set "md5Hash1=%%a"
for /f "skip=1 tokens=* delims=" %%b in ('certutil -hashfile "%filePath2%" MD5') do (
set "md5Hash2=%%b"
for /f "skip=1 tokens=* delims=" %%c in ('certutil -hashfile "%filePath1%" SHA1') do (
set "sha1Hash1=%%c"
for /f "skip=1 tokens=* delims=" %%d in ('certutil -hashfile "%filePath2%" SHA1') do (
set "sha1Hash2=%%d"
for /f "skip=1 tokens=* delims=" %%e in ('certutil -hashfile "%filePath1%" SHA256') do (
set "sha256Hash1=%%e"
for /f "skip=1 tokens=* delims=" %%f in ('certutil -hashfile "%filePath2%" SHA256') do (
set "sha256Hash2=%%f"
goto :compareAllHash
)
)
)
)
)
)
)
)
:compareAllHash
if "%md5Hash1%"=="%md5Hash2%" (
echo.
echo 两个文件的MD5哈希值相同
echo %md5Hash1%
echo %md5Hash2%
set "match=true"
) else (
echo.
echo 两个文件的MD5哈希值不同
echo %md5Hash1%
echo %md5Hash2%
)
if "%sha1Hash1%"=="%sha1Hash2%" (
echo.
echo 两个文件的SHA1哈希值相同
echo %sha1Hash1%
echo %sha1Hash2%
set "match=true"
) else (
echo.
echo 两个文件的SHA1哈希值不同
echo %sha1Hash1%
echo %sha1Hash2%
)
if "%sha256Hash1%"=="%sha256Hash2%" (
echo.
echo 两个文件的SHA256哈希值相同
echo %sha256Hash1%
echo %sha256Hash2%
set "match=true"
echo.
) else (
echo.
echo 两个文件的SHA256哈希值不同
echo %sha256Hash1%
echo %sha256Hash2%
echo.
)
:jiaoyanHash
echo.
for /f "skip=1 tokens=* delims=" %%g in ('certutil -hashfile "%filePathS%" MD5') do (
set "jy_md5Hash=%%g"
for /f "skip=1 tokens=* delims=" %%h in ('certutil -hashfile "%filePathS%" SHA1') do (
set "jy_sha1Hash=%%h"
for /f "skip=1 tokens=* delims=" %%i in ('certutil -hashfile "%filePathS%" SHA256') do (
set "jy_sha256Hash=%%i"
goto :jiaoyanAllHash
)
)
)
)
)
:jiaoyanAllHash
if "%jy_md5Hash%"=="%hashcode%" (
echo 文件的MD5哈希值相同
echo %jy_md5Hash%
echo %hashcode%
echo.
set "match=true"
)
if "%jy_sha1Hash%"=="%hashcode%" (
echo 文件的SHA1哈希值相同
echo %jy_sha1Hash%
echo %hashcode%
echo.
set "match=true"
)
if "%jy_sha256Hash%"=="%hashcode%" (
echo 文件的SHA256哈希值相同
echo %jy_sha256Hash%
echo %hashcode%
echo.
set "match=true"
)
if "%match%"=="false" (
echo MD5、SHA1、SHA256哈希值全不匹配。
echo.
)
```
## 效果
本地测试图例1
!(https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/catch2023-07-21%2020.11.49.png)
在线远程调用测试
```
curl -OfsSL https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/scripts/main/d-bat/md5tools.bat&&call md5tools.bat
```
!(https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/catch2023-07-21%2020.26.26.png)
功能1
!(https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/catch2023-07-21%2020.26.59.png)
功能2
!(https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/catch2023-07-21%2020.27.23.png)
功能3
!(https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/catch2023-07-21%2020.28.23.png) 必须赞一个 学习了! java代码呢? 感谢楼主分享 大佬,哈希值没有做大小写转换吗? 楼主,能改webm视频格式的吗
谢谢分享,正好需要
页:
[1]