@echo off
setlocal enabledelayedexpansionset /p filename=请输入文件名:REM 生成SHA256码
certutil -hashfile "%filename%" SHA256 >tmp.txtREM 指定要读取的行号,即SHA256码
set "lineNumber=1"for /f "skip=1 tokens=1* delims=^" %%i in (tmp.txt) do (set "SHA256Actual=%%i"goto :endloop
)
:endloop
del tmp.txtREM 输出结果
echo 文件%filename%的SHA256是:%SHA256Actual%set /p SHA256Expected=请输入预期SHA256值:if %SHA256Expected% == %SHA256Actual% (echo 两个SHA256比对结果:两个SHA256值相同
) else (echo 两个SHA256比对结果:两个SHA256值不相同
)endlocal
pause
注意要将bat文件格式设置为 ANSI,输入文件名需要包含后缀名,同时需要输入文件路径(除非文件和批处理在同一目录下)。
这段批处理脚本的主要功能是:
- 提示用户输入一个文件名。
- 使用certutil命令为该文件生成SHA256哈希值,并将结果保存到临时文件tmp.txt中。
- 读取tmp.txt文件的第一行(即SHA256哈希值),并将其存储在变量SHA256Actual中。
- 删除临时文件tmp.txt。
- 输出文件的SHA256哈希值。
- 提示用户输入预期的SHA256哈希值。
- 比较输入的预期SHA256值与实际计算出的SHA256值,并输出比较结果。
这段脚本看起来是完整和正确的,但有几点可以改进或注意:
- 错误处理:目前脚本没有处理可能的错误,比如当输入的文件不存在或无法生成SHA256哈希值时。
- 用户体验:在删除tmp.txt之前,可以考虑先询问用户是否确定要删除,或者提供一个选项来选择是否删除。
- 代码清晰度:虽然脚本的逻辑是清晰的,但添加注释和使用更具描述性的变量名可能会使其更容易理解。
- SHA256值的格式:输出的SHA256值可能包含多个空格或其他字符。可以考虑使用certutil -hashfile "%filename%" SHA256 | findstr /r /c:"^ [0-9a-f]{64}"来只获取哈希值部分。
- 安全性:直接从用户输入中获取文件名和预期SHA256值可能存在安全风险,特别是如果脚本被不信任的用户使用。考虑验证用户输入或使用更安全的方法来处理这些值。