计算指定文件的SHA256码,比较两个SHA256码是否相同

@echo off
setlocal enabledelayedexpansion


set /p filename=请输入文件名:


REM 生成SHA256码
certutil -hashfile "%filename%" SHA256 >tmp.txt


REM 指定要读取的行号,即SHA256码
set "lineNumber=1"


for /f "skip=1 tokens=1* delims=^" %%i in (tmp.txt) do (
    set "SHA256Actual=%%i"
    goto :endloop
)
:endloop
del tmp.txt


REM 输出结果
echo 文件%filename%的SHA256是:%SHA256Actual%


set /p SHA256Expected=请输入预期SHA256值:


if %SHA256Expected% == %SHA256Actual% (
    echo 两个SHA256比对结果:两个SHA256值相同
) else (
    echo 两个SHA256比对结果:两个SHA256值不相同
)


endlocal
pause

注意要将bat文件格式设置为 ANSI,输入文件名需要包含后缀名,同时需要输入文件路径(除非文件和批处理在同一目录下)。

这段批处理脚本的主要功能是:

  1. 提示用户输入一个文件名。
  2. 使用certutil命令为该文件生成SHA256哈希值,并将结果保存到临时文件tmp.txt中。
  3. 读取tmp.txt文件的第一行(即SHA256哈希值),并将其存储在变量SHA256Actual中。
  4. 删除临时文件tmp.txt。
  5. 输出文件的SHA256哈希值。
  6. 提示用户输入预期的SHA256哈希值。
  7. 比较输入的预期SHA256值与实际计算出的SHA256值,并输出比较结果。

这段脚本看起来是完整和正确的,但有几点可以改进或注意:

  1. 错误处理:目前脚本没有处理可能的错误,比如当输入的文件不存在或无法生成SHA256哈希值时。
  2. 用户体验:在删除tmp.txt之前,可以考虑先询问用户是否确定要删除,或者提供一个选项来选择是否删除。
  3. 代码清晰度:虽然脚本的逻辑是清晰的,但添加注释和使用更具描述性的变量名可能会使其更容易理解。
  4. SHA256值的格式:输出的SHA256值可能包含多个空格或其他字符。可以考虑使用certutil -hashfile "%filename%" SHA256 | findstr /r /c:"^ [0-9a-f]{64}"来只获取哈希值部分。
  5. 安全性:直接从用户输入中获取文件名和预期SHA256值可能存在安全风险,特别是如果脚本被不信任的用户使用。考虑验证用户输入或使用更安全的方法来处理这些值。

你可能感兴趣的:(脚本,batch)