如何计算校验和并使用批处理文件验证寄存器?我尝试使用受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
(但它永远不会起作用 - 请查看上面的参考资料。)
答案 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%