本帖最后由 StupidLED 于 2025-7-9 11:44 编辑
用人工智障写了一个用来拷贝HEX文件并且自动添加版本号和计算文件哈希的批处理脚本,感觉挺好用的分享给大家参考一下。
首先是版本信息存放的位置,参考论坛里大佬们的帖子,直接放到了启动文件里面
用的时候直接按照地址读出来就好了
然后就是批处理脚本每次从这里读出版本数据然后加到hex的文件名后面就好了。
[C] 纯文本查看 复制代码 @echo off
setlocal enabledelayedexpansion
:: 配置参数(使用相对路径)
set "SCRIPT_DIR=%~dp0"
set "SOURCE_S_FILE=你的存放路径\startup_gd32f10x_hd.s"
set "HEX_FILE=.\你的存放路径\你自己的keil项目工程名.hex"
set "TARGET_DIR=.\FirmwareReleases"
:: 检查必需文件是否存在
if not exist "%SCRIPT_DIR%%SOURCE_S_FILE%" (
echo [ERR] can't find source file: %SOURCE_S_FILE%
echo full path: %SCRIPT_DIR%%SOURCE_S_FILE%
goto :pause_exit
)
if not exist "%SCRIPT_DIR%%HEX_FILE%" (
echo [ERR] can't find hex file: %HEX_FILE%
echo full path: %SCRIPT_DIR%%HEX_FILE%
goto :pause_exit
)
:: 从.s文件中提取版本号
set VERSION_HEX=
for /f "usebackq tokens=3" %%i in (`type "%SCRIPT_DIR%%SOURCE_S_FILE%" ^| findstr /i /c:"appFirmwareVersion" /c:"EQU"`) do (
set "ver_token=%%i"
if "!ver_token:~0,2!"=="0x" (
set VERSION_HEX=!ver_token:~2!
goto :version_found
)
)
:version_found
if not defined VERSION_HEX (
echo [ERR] can't find version info
echo plesase check the source file is include "appFirmwareVersion" and "EQU"
goto :pause_exit
)
:: 确保版本号是8位十六进制
set "VERSION_HEX=00000000%VERSION_HEX%"
set "VERSION_HEX=!VERSION_HEX:~-8!"
:: 转换BCD编码的版本号
set /a "full_version = 0x!VERSION_HEX!" 2>nul || (
echo [ERR] version format error: 0x!VERSION_HEX!
goto :pause_exit
)
:: 提取版本组件
set /a "major = (full_version >> 24) & 0xFF"
set /a "b_version = (full_version >> 16) & 0xFF"
set /a "d_version = full_version & 0xFFFF"
:: 将BCD值转换为十进制
call :convert_bcd major %major%
call :convert_bcd b_version %b_version%
set /a "d_high = (d_version >> 8) & 0xFF"
set /a "d_low = d_version & 0xFF"
call :convert_bcd d_high_val %d_high%
call :convert_bcd d_low_val %d_low%
:: 组合为4位十进制数
set /a "d_dec = d_high_val * 100 + d_low_val"
set d_version=!d_dec!
:: 格式化版本字符串
set "major=00%major%"
set "b_version=00%b_version%"
set "d_version=0000%d_version%"
set VERSION_STR=V%major:~-2%B%b_version:~-2%D%d_version:~-4%
:: 创建时间戳(兼容性方法)
for /f "tokens=2 delims==" %%d in ('wmic os get localdatetime /value 2^>nul') do set "datetime=%%d"
if not defined datetime (
echo [警告] 无法使用WMIC获取时间,使用替代方法
set "datetime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%"
)
set TIMESTAMP=%datetime:~0,8%_%datetime:~8,6%
set TIMESTAMP=%TIMESTAMP: =0%
:: 创建目标目录
if not exist "%SCRIPT_DIR%%TARGET_DIR%" (
mkdir "%SCRIPT_DIR%%TARGET_DIR%"
)
:: 构造新文件名
for %%F in ("%SCRIPT_DIR%%HEX_FILE%") do (
set "hex_name=%%~nF"
set "hex_ext=%%~xF"
)
set "safe_filename=%hex_name%_%VERSION_STR%_%TIMESTAMP%%hex_ext%"
set "safe_filename=%safe_filename::=%"
set "safe_filename=%safe_filename: =_%"
set "safe_filename=%safe_filename:/=_%"
set "safe_filename=%safe_filename:\=_%"
echo caculating hash...
set "hash="
set "hash_file=HASH_%VERSION_STR%.txt"
set "full_hash="
:: 计算完整SHA256哈希值
for /f "delims=" %%h in ('powershell -Command "(Get-FileHash -LiteralPath '%SCRIPT_DIR%%HEX_FILE%' -Algorithm SHA256).Hash" 2^>nul') do (
set "full_hash=%%h"
)
:: 检查哈希值是否获取成功
if "!full_hash!"=="" (
echo [ERR] can't get file hash!
set "full_hash=0000000000000000000000000000000000000000000000000000000000000000"
)
:: 复制文件到目标位置
copy "%SCRIPT_DIR%%HEX_FILE%" "%SCRIPT_DIR%%TARGET_DIR%\%safe_filename%" >nul
if errorlevel 1 (
echo [ERR] file copy failed!
echo source file: %SCRIPT_DIR%%HEX_FILE%
echo target file: %SCRIPT_DIR%%TARGET_DIR%\%safe_filename%
goto :pause_exit
)
:: 创建哈希文件
echo creating hash file...
echo SHA256: !full_hash! > "%SCRIPT_DIR%%TARGET_DIR%\!hash_file!"
echo File: %safe_filename% >> "%SCRIPT_DIR%%TARGET_DIR%\!hash_file!"
echo Version: %VERSION_STR% >> "%SCRIPT_DIR%%TARGET_DIR%\!hash_file!"
echo Timestamp: %TIMESTAMP% >> "%SCRIPT_DIR%%TARGET_DIR%\!hash_file!"
:: 显示成功信息
echo version code: %VERSION_STR%
echo timestamp: %TIMESTAMP%
echo save file as: %SCRIPT_DIR%%TARGET_DIR%\%safe_filename%
echo hash file: %SCRIPT_DIR%%TARGET_DIR%\!hash_file!
goto :pause_exit
:: BCD转十进制函数
:convert_bcd
setlocal
set "value=%~2"
set /a "high = (value >> 4) * 10"
set /a "low = value & 0xF"
set /a "dec = high + low"
endlocal & set "%~1=%dec%"
exit /b
:: 暂停并退出
:pause_exit
echo.
echo Press any key to exit...
pause >nul
endlocal
exit /b
用的时候记得改一下你的启动文件和hex文件的路径,按实际情况就可以
然后我是习惯把这个放到keil里面直接编译完调用
最后是关于时间戳和哈希码,由于我这个只是公司内部同事软件测试的时候标记版本用的,就没有用编译时间(不会用,求指导),只是简单把拷贝文件的时间添加到文件名里面,然后按照版本生成一个hex文件的哈希值,暂时不知道可以拿来干嘛。。。。。。
效果
最后是想请教一下论坛的各位巨佬,是怎么搞这种输出文档的版本信息的管理的,GCC的话是不是用makefile搞?想学习一下
|