如何用批处理文件读取Hex文件指定内存地址值并校验
修复Hex文件地址值读取与对比的批处理脚本
原脚本的核心问题
- 地址转换逻辑错误:
set ADDRESS=A400是十六进制地址,但set /a默认按十进制解析,会导致ADDRESS_HEX变量赋值失败,无法匹配目标地址。 - 预期值格式错误:
EXPECTED_VALUE开头的空格会直接导致对比不匹配。 - 变量清理语法错误:
set "VALUE=%VALUE:=%"无法实现空格清理,正确语法应为set "VALUE=%VALUE: =%"。 - 未处理延迟扩展:
for循环内赋值的VALUE变量,外部直接读取会获取到循环前的空值。 - 匹配规则不准确:
certutil -dump输出的地址可能存在大小写差异,原脚本未做兼容。
修复后的完整脚本
@echo off setlocal enabledelayedexpansion REM 设置Hex文件路径 set "HEX_FILE=hex.hex" REM 指定要检查的内存地址(十六进制,直接使用) set "ADDRESS=A400" REM 指定预期的十六进制值(无多余空格) set "EXPECTED_VALUE=20A0E3EB" REM 从Hex文件中读取指定地址对应的值 for /f "tokens=2 delims=: " %%a in ('certutil -f -dump !HEX_FILE! ^| findstr /i /b /c:"!ADDRESS!:"') do ( set "VALUE=%%a" ) REM 移除值中的所有空格 set "VALUE=!VALUE: =!" REM 对比实际值与预期值 if /i "!VALUE!"=="!EXPECTED_VALUE!" ( echo 文件%HEX_FILE%中地址%ADDRESS%的值正确:!VALUE! ) else ( echo 文件%HEX_FILE%中地址%ADDRESS%的值不匹配。预期:%EXPECTED_VALUE%,实际:!VALUE! ) pause endlocal
关键修复点说明
- 启用
setlocal enabledelayedexpansion,使用!变量!的形式读取实时变量值,解决循环内变量赋值后无法立即获取的问题。 - 直接使用十六进制地址,跳过错误的十进制转换步骤。
- 清理预期值的多余空格,保证对比的准确性。
- 修正空格清理的语法,正确移除值中的所有空格。
- 在
findstr中添加/i参数忽略大小写,适配certutil输出的地址大小写情况。
内容的提问来源于stack exchange,提问作者AVINASH SHIVANAND KUMBAR
相关产品推荐
相关产品推荐

