批量生成TIF文件MD5校验值与文件名对应列表问题求助
批量生成TIF文件MD5校验值的解决方案
我需要为目录下600个TIF文件生成MD5校验值,要求每行显示校验值及其对应的文件名,示例格式如下:
b1039a6f0c4295916a82833f507f5e78 vol1_0001.tif
dd3fb454e8d4912934f7626baf105e36 vol1_0002.tif
etc.
尝试了两段Windows批处理脚本,但均未达到预期效果:
第一段脚本及问题
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
问题:校验值生成正常,但关联文件名时,仅重复输出最后一个文件的校验值与文件名对。
第二段脚本及问题
@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%" )
问题:所有文件名均对应最后一个文件的校验值,未达到预期效果。
问题根源
两段脚本的核心问题都是未在循环内即时关联当前文件的校验值与文件名:
- 第一段的三个
for循环独立执行,最后一个循环只会输出最后一次赋值的%hash%和%filename%。 - 第二段的外层循环输出时,
!Hash!已经被最后一个文件的Hash覆盖,没有在内层循环完成对应输出。
正确的批处理脚本
直接在循环内完成单个文件的Hash计算、处理与输出,确保一一对应:
@echo off setlocal enabledelayedexpansion set "OutputFile=CheckSum.md5" :: 清空输出文件 type nul > "%OutputFile%" :: 遍历当前目录下vol1开头的TIF文件(需所有TIF则改为*.tif) for %%F in (vol1*.tif) do ( :: 计算MD5并过滤多余输出行 for /f "skip=1 delims=" %%H in ('certutil -hashfile "%%F" md5 ^| find /v "hash" ^| find /v "CertUtil"') do ( set "rawHash=%%H" :: 移除Hash值中的空格 set "cleanHash=!rawHash: =!" :: 输出到控制台与文件 echo !cleanHash! %%~nxF echo !cleanHash! %%~nxF >> "%OutputFile%" ) ) endlocal
脚本说明
- 启用
enabledelayedexpansion保证循环内变量即时更新。 - 内层
for循环过滤certutil的冗余输出,仅保留Hash值行。 - 通过
!rawHash: =!去除Hash中的空格,得到连续的MD5字符串。 - 在内层循环完成输出,确保每个文件的Hash与文件名严格对应。
如果需要遍历指定目录及子目录下的所有TIF文件,使用以下版本:
@echo off setlocal enabledelayedexpansion set "Folder=C:\Users\Me\desktop\MyFolder" set "OutputFile=HashList.md5" type nul > "%OutputFile%" for /f "delims=" %%F in ('dir /s /b /a-d "%Folder%\*.tif"') do ( for /f "skip=1 delims=" %%H in ('certutil -hashfile "%%F" md5 ^| find /v "hash" ^| find /v "CertUtil"') do ( set "rawHash=%%H" set "cleanHash=!rawHash: =!" echo !cleanHash! %%~nxF echo !cleanHash! %%~nxF >> "%OutputFile%" ) ) endlocal
内容的提问来源于stack exchange,提问作者Laura Lannan
相关产品推荐
相关产品推荐

