hoochanlon 发表于 2023-7-21 22:25

【批处理】基于坛友的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)

kong1988 发表于 2023-7-22 08:51

必须赞一个

waishr 发表于 2023-7-22 10:13

学习了!

taotao1997 发表于 2023-7-23 13:02

java代码呢?

Thor666 发表于 2023-7-23 15:40

感谢楼主分享

faifi 发表于 2023-12-14 01:30

大佬,哈希值没有做大小写转换吗?

赖炳君66 发表于 2024-5-22 00:07

楼主,能改webm视频格式的吗

会放电的皮卡丘 发表于 2024-5-27 11:00

谢谢分享,正好需要
页: [1]
查看完整版本: 【批处理】基于坛友的java编写md5校验工具而写了个md5、sha1、sha256批处理工具