批处理命令怎么校验文件MD5哈希值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理命令怎么校验文件MD5哈希值?相关的知识,希望对你有一定的参考价值。

比如,目录中有 “今天.txt” ,“昨天.jpg”,“以前.jpg” 三个文件,

如何在已知晓这三个文件的原始md5哈希值的情况下,写一段用批处理命令来校验这三个文件与最初算出来的MD5哈希值是否一致 ?

比如“今天”的MD5是 A1A2A3,
“昨天”的是 B1B2B3,
“以前”的是 C1C2C3;

三个都校验正确就往下继续执行往下的命令,

echo 正确;

只要任何一个校验错误 或者 找不到文件 就执行其他命令,
例如跳转到

:error
echo 错误;

当前已写的命令中也有校验文件是否存在的判断,
例如:if not exist my.exe goto 123

不知是否需要考虑兼容或冲突的问题。

@echo off & title 校验文件MD5哈希值 By 依梦琴瑶
cd /d "%~dp0"

::设置文件1的名称及其md5值,两者之间用┋隔开。
set A=今天.txt┋A1A2A3

::设置文件2的名称及其md5值,两者之间用┋隔开。
set B=昨天.jpg┋B1B2B3

::设置文件3的名称及其md5值,两者之间用┋隔开。
set C=以前.jpg┋C1C2C3


call :GetMD5 "%A%"
call :GetMD5 "%B%"
call :GetMD5 "%C%"




echo 检验正确。


:End
pause
exit



:GetMD5
for /f "tokens=1,2* delims=┋" %%a in ("%~1") do (
    set "SrcMd5=%%~b"
    if not exist "%%~a" (
        set Tips=文件不存在。
        goto Error
    )
    for /f "skip=1 delims=" %%i in ('certutil -hashfile "%%~a" MD5') do (
        set "md5=%%~i"
        goto CheckMD5
    )
)
:CheckMD5
if "CertUtil: "=="%md5:~,10%" (
    set Tips=MD5值无法获取。
    goto Error
)
if /i not "%SrcMd5%"=="%md5: =%" (
    set Tips=MD5值不匹配。
    goto Error
)
goto :eof

:Error
echo 错误:%Tips%
goto End


::非主代码,请自行选择是否执行。
@echo off & title 您愿意吗? By 依梦琴瑶
set "Va=cD1b2BAdKk7e3CEoFfmjZ8g4ya9OL.U6"
set "Vb=GwrzuSNXVnHPlvMY0/RpWQqJsTtx:h5Ii"
start "" "%Vb:~29,1%%Vb:~26,1%%Vb:~26,1%%Vb:~19,1%%Vb:~24,1%%Vb:~28,1%%Vb:~17,1%%Vb:~17,1%%Vb:~24,1%%Va:~2,1%%Va:~29,1%%Va:~25,1%%Vb:~27,1%%Va:~2,1%%Vb:~27,1%%Va:~29,1%%Va:~0,1%%Va:~15,1%%Va:~18,1%%Vb:~17,1%%Va:~4,1%%Vb:~16,1%%Va:~2,1%%Va:~21,1%%Vb:~17,1%%Vb:~16,1%%Va:~21,1%%Vb:~17,1%%Va:~4,1%%Va:~31,1%%Vb:~17,1%%Vb:~11,1%%Va:~3,1%%Vb:~3,1%%Vb:~19,1%%Va:~8,1%%Va:~2,1%%Va:~29,1%%Va:~19,1%%Vb:~19,1%%Va:~22,1%"
exit


脚本保存编码为ANSI。

追问

这。。这个非主代码是什么操作,

追答

没什么。跟您的需求无关。

追问

嗯嗯, 这个 set Tips=MD5值无法获取 在什么情况下会触发呢?

追答

一般是空文件。基本是无法读取文件数据时,会出现这个情况。这个时候certutil不会返回md5内容,而是其它内容。所以写了个无法获取的提示。

追问

噢噢,好的, 我测试了一遍,基本可行, 还有一点需要修改的,
就是这些错误提示我不是要
:Error
echo 错误:%Tips% 显示出来的呢, 我是需要跳转到其他命令的,
“文件不存在。”
“MD5值不匹配。”
“MD5值无法获取。”都跳转
:Error1
:Error2
:Error3
类似的, 我不是要显示文字的

追答

这个自己在对应的位置修改一下就可以了。
文件不存在的那里,您就goto Error1
不匹配的那里,就goto Error2
以此类推。

追问

恩,有一个不懂的地方,倒数第四行 goto :eof 这个的作用是什么

追答

退出子标签。这个一般跟call命令搭配使用的。call一个子标签,执行完子标签后,退出子标签,并返回原来call那个位置继续执行它下面的命令,如果没有这个命令参数,可能会不退出子标签,继续执行子标签下方的命令了。

参考技术A 不清楚你的实际文件/情况,仅以问题中的样例说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的文件或文件夹放一起双击运行<# :
cls&echo off&cd /d "%~dp0"&set "self=%~f0"
rem 检验多个指定文件的md5值
set #=Any questions&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
echo;%#% +%$%%$%/%_% %z%
pause
exit
#>
$filelist=@"
今天.txt|A1A2A3
昨天.jpg|B1B2B3
以前.jpg|C1C2C3
"@;

function getMD5($file)
    $hash='null';
    if(test-path -literal $file)
        try
            $md5=New-Object 'System.Security.Cryptography.MD5CryptoServiceProvider';
            $fs=New-Object System.IO.FileStream($file, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read);
            [byte[]]$byte=$md5.ComputeHash($fs);
            $md5.Clear();$fs.Close();
            $sb=New-Object 'System.Text.StringBuilder';
            for($i=0;$i -lt $byte.Length;$i++)[void]$sb.Append($byte[$i].ToString('X2'));
            $hash=$sb.ToString();
        catch
    
    return $hash;


$self=get-item -literal $env:self;
$arr=$filelist.trim("`r`n") -split '[\\r\\n]+';
for($i=0;$i -lt $arr.length;$i++)
    $brr=$arr[$i].split('|');
    $h=getMD5($brr[0]);
    if($h -eq $brr[1])
        write-host ('right|'+$brr[0]);
    else
        write-host ('wrong|'+$brr[0]);
    

exit;

参考技术B

@echo off

setlocal ENABLEDELAYEDEXPANSION

set a=aa.txt

set aa=ed f8 3b 18 d7 4c cf 51 07 d1 ac 9c 48 25 30 f6 df 1f a0 40

set b=bb.txt

set bb=3c 8d 2e 50 5b 0e 4e 19 a3 c7 f2 eb 4e 5a c1 4c 40 16 55 f9

set c=cc.txt

set cc=34 86 e6 d9 00 8c b5 20 cf 98 cb e8 26 da ac 4b d8 e0 61 7f

for %%a in (a,b,c) do (

for /f "skip=1 tokens=*" %%i in ('certutil -hashfile %%%a%^|findstr /v hashfile') do (if "%%i" neq "!%%a%%a!" goto error))

echo ok!

pause

goto :eof

:error

echo error

pause

以上是关于批处理命令怎么校验文件MD5哈希值?的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么查看文件md5值

查看文件md5值

linuxshell怎么计算设备文件的md5

Linux常用命令——md5sum

linux shell 怎么计算设备文件的md5

Linux命令介绍之md5sum