批处理命令怎么校验文件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哈希值?的主要内容,如果未能解决你的问题,请参考以下文章