我对命令行还很陌生,我正在为此苦苦挣扎。
我正在尝试对文件夹中的许多文件进行校验和,并且我想输出以包含校验和,后跟文件名。因此,理想情况下,输出看起来像这样:
b1039a6f0c4295916a82833f507f5e78 vol1_0001.tif
dd3fb454e8d4912934f7626baf105e36 vol1_0002.tif
等等。对于文件夹中的所有文件(均为 .tif 文件)。
这是我尝试过的:
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%"
)`
但这也不起作用。我得到了文件名列表,但每个文件名都有完全相同的校验和(对于文件夹中的最后一个文件)。
对此有什么建议吗?我真的不想手动执行此操作,因为我有超过 600 个文件需要处理。
谢谢!
您已经非常接近了,但是将
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
)