MD5,有许许多多的用途,但在御所,基本就是用来确认你下载的文件是否在下载中坏了。
比如8酱会说:
核对下MD5,看看是不是文件下载受损
文件名称: Rxxx.jpg
文件大小: 8.25 GB (8,860,252,050 字节)
MD5: 4E1CE94DC5009C93A6390A82E7596F0A
自行核对MD5,MD5不一致就证明压缩包下载受损,可以尝试使用我在压缩包内的rr3修复记录,修复不了就重新下载去 ╮(╯▽╰)╭
MD5 结果不区分大小写。
如何计算呢?要么跟8酱一样用软件。要么可以用脚本。比如,将以下2.0版本代码复制到一个txt文本中,修改后缀为bat。
复制到需要计算图片,压缩包的地方,双击运行,就会自动计算同目录下对应类型文件md5。
或者把单个文件 拖拽到上面。
再或者把一个文件夹拖拽到上面。
@echo off
rem "设置文件编码UTF-8 不然输出中文会乱码"
chcp 65001 >nul
setlocal enabledelayedexpansion
echo ========================御所MD5工具v2.1========================
rem "检查是否有参数传递"
if "%~1"=="" (
rem 没有参数传递,遍历当前目录内的文件
set "retFname=MD5结果.txt"
echo 无输入参数,同文件夹内遍历结果保存在!retFname!
set "dirPath=."
) else (
rem 有参数传递,检查是文件夹还是文件
if exist "%~1\" (
set "inputPath=%~1"
echo 输入参数: !inputPath!
rem 是文件夹
set "dirPath=%~1"
set "retFname=%~nx1_MD5.txt"
echo 文件夹名称: %~nx1
) else (
rem 是文件判断参数数量
set argc=0
for %%a in (%*) do set /a argc+=1
if !argc! equ 1 (
set "inputPath=%~1"
echo 输入参数: !inputPath!
if exist "%~1" (
set "filePath=%~1"
set "retFname=%~nx1_MD5.txt"
echo 文件名称: %~nx1
rem "只有一个文件 跳转到单个文件的部分"
goto :fileMD5
) else (
echo "%~1" 不存在。
pause
exit /b
)
) else (
echo 输入参数: %*
rem "列表文件"
set "retFname=MD5结果.txt"
set "dirPath=."
goto :listMD5
)
)
)
echo.
rem "==========文件夹遍历MD5"
:dirMD5
rem "输出文件名 一个 > 覆盖之前的记录"
echo 自行核对MD5,MD5不一致就证明压缩包下载受损,可以尝试使用压缩包内的rr3修复记录(如有),修复不了就重新下载去 ╮(╯▽╰)╭ > !retFname!
rem "2个 >> 续写,添加一个空行"
echo. >> !retFname!
for %%f in ("%dirPath%\*.jpg" "%dirPath%\*.rar" "%dirPath%\*.7z" "%dirPath%\*.mp4") do (
echo 开始计算:%%~nxf
rem "获取文件大小"
set "size=%%~zf"
set "Tsize=%%~zf"
call :calSize
rem Calculate MD5 checksum and convert to uppercase
for /f "tokens=*" %%a in ('certutil -hashfile "%%f" MD5 ^| find /i /v "certutil" ^| find /i /v "MD5"') do set "checksum=%%a"
set "checksum=!checksum: =!"
set "checksum=!checksum:~0,32!"
set "checksum=!checksum:~0,32!"
rem "写到文件"
echo 文件名称:%%~nxf >> !retFname!
echo 文件大小:!sizeFormatted! >> !retFname!
echo MD5:!checksum! >> !retFname!
echo. >> !retFname!
rem "打印到屏幕"
echo MD5:!checksum!
echo.
)
echo MD5 计算完毕 输出文件:!retFname!.
pause
goto :eof
rem "==========列表遍历MD5"
:listMD5
rem "2个 >> 续写,添加一个空行"
echo============ >> !retFname!
echo. >> !retFname!
for %%f in (%*) do (
echo %%f
echo 开始计算:%%~nxf
rem "获取文件大小"
set "size=%%~zf"
set "Tsize=%%~zf"
call :calSize
rem Calculate MD5 checksum and convert to uppercase
for /f "tokens=*" %%a in ('certutil -hashfile "%%~f" MD5 ^| find /i /v "certutil" ^| find /i /v "MD5"') do set "checksum=%%a"
set "checksum=!checksum: =!"
set "checksum=!checksum:~0,32!"
set "checksum=!checksum:~0,32!"
rem "写到文件"
echo 文件名称:%%~nxf >> !retFname!
echo 文件大小:!sizeFormatted! >> !retFname!
echo MD5:!checksum! >> !retFname!
echo. >> !retFname!
rem "打印到屏幕"
echo MD5:!checksum!
echo.
)
echo MD5 计算完毕 输出文件:!retFname!.
pause
goto :eof
rem "==========单个文件MD5"
:fileMD5
rem "单个文件就不要前置了"
echo. > !retFname!
for %%f in ("%filePath%") do (
rem "获取文件大小"
set "size=%%~zf"
set "Tsize=%%~zf"
call :calSize
rem Calculate MD5 checksum and convert to uppercase
for /f "tokens=*" %%A in ('certutil -hashfile "%filePath%" MD5 ^| find /i /v "certutil" ^| find /i /v "MD5"') do set "checksum=%%A"
set "checksum=!checksum: =!"
set "checksum=!checksum:~0,32!"
set "checksum=!checksum:~0,32!"
rem "写到文件"
echo 文件名称:%%~nxf >> !retFname!
echo 文件大小:!sizeFormatted! >> !retFname!
echo MD5:!checksum! >> !retFname!
echo. >> !retFname!
rem "打印到屏幕"
echo MD5:!checksum!
echo.
)
echo MD5 计算完毕 输出文件:!retFname!.
pause
goto :eof
rem ""==========独立出核心计算部分。用于支持拖拉拽。拽了单个文件不在后缀里面"
:calSize
set "Fsize="
rem "添加千位符"
call :format
rem "Powershell 脚本需要签名或者改策略,bat脚本最多32位整数计算(2GB),我TM。"
set "sizeLow=!size:~-8!"
set "sizeHigh=!size:~0,-8!"
if "!sizeHigh!"=="" (
set /a "tSizeHigh=0"
) else (set /a "tSizeHigh=!sizeHigh!")
call :removeZeros !sizeLow!
set /a "tSizeLow=!outputStr!"
rem echo 文件大小:!Fsize! 字节 rem "调试的时候输出备份"
rem echo 字符串 高位:!sizeHigh! 低位:!sizeLow!
rem echo 整数变量 高位:!tSizeHigh! 低位:!tSizeLow!
rem "转换KB 高位"
set /a "HsizeKB=!tSizeHigh! * 97656"
set /a "HsizeB=!tSizeHigh! * 256"
rem "转换KB 低位"
set /a "LsizeKB=!tSizeLow! / 1024"
set /a "LsizeB=!tSizeLow! %% 1024"
rem "合并结果 并且进一步缩减"
set /a "sizeKB=!HsizeKB! + !LsizeKB!"
set /a "sizeB=!HsizeB! + !LsizeB!"
set /a "sizeKB_t=!sizeB! / 1024"
set /a "sizeB=!sizeB! %% 1024"
set /a "sizeKB=!sizeKB! + !sizeKB_t!"
rem echo 整数变量 KB:!sizeKB! B:!sizeB!
rem "继续转换成MB MB的余数"
set /a "sizeMB=!sizeKB! / 1024"
set /a "sizeMB_KB=!sizeKB! %% 1024"
if !sizeMB! LSS 972 (
rem "小于972MB(0.95GB) 用MB 只有整数运算,所以*100 再除获取小数部分 几B的影响忽略不计"
if !sizeMB! LSS 1 (
rem "强迫症还是想把KB加回来"
set "sizeFormatted=!sizeKB! KB (!Fsize! 字节)"
) else (
set /a "sizeMB_KB_10=!sizeMB_KB! * 100 / 1024"
rem "小于10前面补0"
if !sizeMB_KB_10! LSS 10 set "sizeMB_KB_10=0!sizeMB_KB_10!"
set "sizeFormatted=!sizeMB!.!sizeMB_KB_10! MB (!Fsize! 字节)"
)
) else (
rem "大于972MB 开始用GB显示。这样才会有0.95GB"
set /a "sizeGB=!sizeMB! / 1024"
set /a "sizeGB_MB=!sizeMB! %% 1024"
set /a "sizeGB_MB_10=!sizeGB_MB! * 100 / 1024"
rem "小于10前面补0"
if !sizeGB_MB_10! LSS 10 set "sizeGB_MB_10=0!sizeGB_MB_10!"
set "sizeFormatted=!sizeGB!.!sizeGB_MB_10! GB (!Fsize! 字节)"
)
echo 文件大小:!sizeFormatted!
goto :eof
rem "==========添加千位符"
:format
if "!Tsize!"=="" goto endFormat
set "lastThree=!Tsize:~-3!"
set "Tsize=!Tsize:~0,-3!"
if defined Fsize (
set "Fsize=!lastThree!,!Fsize!"
) else (
set "Fsize=!lastThree!"
)
goto format
:endFormat
goto :eof
rem ""==========字符串移除前置0"
:removeZeros
set "inputStr=%~1"
set "outputStr=%inputStr%"
:loop
if "!outputStr:~0,1!"=="0" (
set "outputStr=!outputStr:~1!"
goto loop
)
if "%outputStr%"=="" set "outputStr=0"
goto :eof
效果如动图。

实际上这个MD5脚本还应该进一步完善,比如支持同时拖拽多个文件。但是好像需求不大,所以我选择咕咕咕。
结果没咕咕咕成功,还是实现了拖拽多个文件。