如何计算校验和并验证注册批处理文件?

时间:2018-02-17 11:38:36

标签: windows batch-file checksum

如何计算校验和并使用批处理文件验证寄存器?我尝试使用受https://stackoverflow.com/a/42706309/4539999启发的重定向/管道(最好从批处理文件调用),并寻找比https://stackoverflow.com/a/42172138/4539999更简单的内容。

许多对此Ascynchronous线程问题没有答案的观点

  

...管道的每一侧都在自己的ascynchronous线程中启动自己的cmd.exe ......

在此处描述: Why does delayed expansion fail when inside a piped block of code?来自@dbenham的最佳校验和解决方案https://stackoverflow.com/a/42172138/4539999

=====回到尝试:

 CertUtil -hashfile "path_to_file" MD5 | find /i /v "md5" | find /i /v "certutil"

第一个命令的输出如何在第二个命令中用作查找字符串?例如,使用NestBat.bat:

C:\Users\User\Code\NestBat>certutil -hashfile NestBat.bat MD5 | find /i /v "md5" | find /i /v "certutil"
c19c099a7703768ef1b8dbeec3c45dba

C:\Users\User\Code\NestBat>find "c19c099a7703768ef1b8dbeec3c45dba" Manifest.MD5

---------- MANIFEST.MD5
c19c099a7703768ef1b8dbeec3c45dba  NestBat.bat

类似的东西:

@echo off
:: ValidateHashcode.bat    
setlocal enabledelayedexpansion
CertUtil -hashfile "%1" MD5 | find /i /v "md5" | find /i /v "certutil" ^> %temp%\Hashcode.tmp
set Hashcode=^<%temp%\Hashcode.tmp
del %temp%\Hashcode.tmp
find "%Hashcode%" Manifest.MD5
if NOT "%ERRORLEVEL%"=="0" echo *** Process Error ****
set Hashcode=
endlocal

(但它永远不会起作用 - 请查看上面的参考资料。)

2 个答案:

答案 0 :(得分:0)

来自Stephan的回答是Win7下的测试场景:

C:\Users\user\test>type test.bat
@echo off
:: ValidateHashcode.bat
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('CertUtil -hashfile "%~1" MD5 ^| findstr /v "MD5 CertUtil"') do set "Hashcode=%%a"
set "Hashcode=%Hashcode: =%"
find "%Hashcode%" Manifest.MD5 > nul
if "%Errorlevel%"=="0" echo *** Valid file: %Hashcode% %~1
if NOT "%Errorlevel%"=="0" echo *** Invalid file: %Hashcode% %~1
set Hashcode=
endlocal

C:\Users\user\test>ver
*** Valid file: eb3074bbe51278a11326fda1b244cbae test.tmp

通过删除查找重定向到nul进行测试

find "%Hashcode%" Manifest.MD5

输出:

C:\Users\user\test>test test.tmp

---------- MANIFEST.MD5
eb3074bbe51278a11326fda1b244cbae test.tmp
*** Valid file: eb3074bbe51278a11326fda1b244cbae test.tmp

C:\Users\user\test>ver

Microsoft Windows [Version 6.1.7601]

答案 1 :(得分:0)

您的代码中有两个错误:

CertUtil -hashfile "%1" MD5 | find /i /v "md5" | find /i /v "certutil" ^> %temp%\Hashcode.tmp

不要转义重定向符号:

CertUtil -hashfile "%1" MD5 | find /i /v "md5" | find /i /v "certutil" > "%temp%\Hashcode.tmp"

相同
set Hashcode= ^<%temp%\Hashcode.tmp

不要逃避重定向符号。并且应该set /p将变量设置为文件的内容(确切地说,第一行):

set /p Hashcode= <"%temp%\Hashcode.tmp"

注意:我建议使用"%~1"而不仅仅是"%1"(如果您使用Drag&#39; n Drop,带空格的文件名将包含周围的引号。~删除他们(只是为了确保没有像""file with spaces.ext""这样的双引号)

编辑我知道each side of the pipe...这件事,但我没看到,这里有什么用处。以下代码在这里运行正常:

@echo off
:: ValidateHashcode.bat    
setlocal enabledelayedexpansion
CertUtil -hashfile "%~1" MD5 | find /i /v "md5" | find /i /v "certutil" > %temp%\Hashcode.tmp
set /p Hashcode=<%temp%\Hashcode.tmp
del %temp%\Hashcode.tmp
echo %Hashcode%

输出:

C:\Users\Stephan\test>test.bat temp.txt
da6d921549b68ed59213022297a956fb

注意:您可以使用for /f循环来获取没有临时文件的值:

@echo off  
for /f "delims=" %%a in ('CertUtil -hashfile "%~1" MD5 ^| findstr /v "MD5 CertUtil"') do set "Hashcode=%%a"
set "Hashcode=%Hashcode: =%"
echo %Hashcode%