我正在尝试输出目录中 600 个 tif 文件的校验和。我希望每一行都显示校验和,后跟其各自的文件名。
例如:
b1039a6f0c4295916a82833f507f5e78 vol1_0001.tif
dd3fb454e8d4912934f7626baf105e36 vol1_0002.tif
etc.
这是我尝试过的:
for %%F in (vol1*.*) do certutil -hashfile "%%F" md5 | find /V "hash" >>temp.txt
for %%a in (vol1*.*) do set filename=%%~nxa
for /f "tokens=* delims=" %%i in (temp.txt) do set hash=%%i
@echo %hash% %filename% >>CheckSum.md5
第一部分工作正常,我得到了一个包含我需要的所有校验和的
.txt
文件。但第二部分不起作用。
我得到的只是目录中最后一个文件的校验和和文件名对,重复了很多次。
在同事的推荐下我也尝试过这个方法,但这也没有用:
@echo off
Set "Folder=C:\Users\Me\desktop\MyFolder"
Set "OutPutFile=%~dp0HashList.md5"
Type nul>"%OutPutFile%"
SetLocal EnableDelayedExpansion
@for /f "delims=" %%a in ('Dir /S /B /A-D "%Folder%"') do (
@for /f "skip=1 delims=" %%H in ('CertUtil -hashfile "%%~a" md5 ^| find /V "hash"') do set "Hash=%%H"
echo %%a, !Hash: =!
echo %%a, !Hash: =! >>"%OutPutFile%"
)
我得到了文件名列表,但每个文件名都有完全相同的校验和(对于目录中的最后一个文件)。
您已经非常接近了,但是将
certutil
重定向到 find /v "hash"
只会返回一行,然后您可以使用 skip=1
跳过这一行。另外,请对 for
循环变量使用大写字母,因为某些小写字母会被解释为变量修饰符。
@echo off
SetLocal EnableDelayedExpansion
set "Folder=C:\Users\Me\desktop\MyFolder"
set "output_file=%~dp0Hashlist.md5"
for /f "delims=" %%A in ('Dir /S /B /A-D "%Folder%"') do (
for /f "delims=" %%H in ('CertUtil -hashfile "%%~A" md5 ^| find /V "hash"') do set "Hash=%%H"
echo !Hash: =! %%A
>>"%output_file%" echo !Hash: =! %%A
)