如何在批处理脚本中从gcovr控制台提取行、分支、函数覆盖率结果
Windows批处理提取gcovr覆盖率百分比并保存
需求背景
执行以下gcovr命令生成覆盖率报告:
gcovr -v -b -r .^ --xml-pretty^ -o ".\reports\publish\coverage.xml"^ --sort-percentage^ -s ^ --exclude=".*(abcd_|_abcd|-xy|xy_|_xy($|\/)|APK_GENERATED).*" || goto :error
命令执行后控制台会输出各类日志,最终包含如下格式的覆盖率数据:
(DEBUG) Gathered coveraged data for 23 files
- lines: 99.9% (1104 out of 1105)
- functions: 100.0% (142 out of 142)
- branches: 96.6% (312 out of 323)
需要提取其中的百分比数据,保存为如下格式的文件:
- lines: 99.9%
- functions: 100.0%
- branches: 96.6%
批处理实现脚本
@echo off setlocal enabledelayedexpansion :: 定义文件路径 set "RESULT_FILE=.\reports\publish\coverage_summary.txt" set "TEMP_FILE=gcovr_output.tmp" :: 执行gcovr,同时输出到控制台和临时文件,保留错误码 powershell -Command "& {gcovr -v -b -r . --xml-pretty -o '.\reports\publish\coverage.xml' --sort-percentage -s --exclude='.*(abcd_|_abcd|-xy|xy_|_xy($|\/)|APK_GENERATED).*' | Tee-Object -FilePath %TEMP_FILE%; exit $LASTEXITCODE}" || goto :error :: 提取目标覆盖率行,处理格式后写入结果文件 > "%RESULT_FILE%" ( for /f "delims=(" %%a in ('findstr /r "^- lines: ^- functions: ^- branches:" %TEMP_FILE%') do ( set "raw_line=%%a" :: 去掉行尾的空格(括号前的多余空格) echo !raw_line:~0,-1! ) ) :: 清理临时文件 del %TEMP_FILE% 2>nul echo 覆盖率摘要已保存到 %RESULT_FILE% goto :end :error echo 错误:gcovr执行失败,错误代码:%errorlevel% del %TEMP_FILE% 2>nul exit /b %errorlevel% :end endlocal
脚本说明
- 双输出处理:借助PowerShell的
Tee-Object,既保留gcovr的控制台输出,又将内容写入临时文件用于后续提取。 - 精准行过滤:用
findstr正则匹配,只筛选包含lines:、functions:、branches:的目标行,避免无关日志干扰。 - 格式修正:通过
for /f以左括号为分隔符截取内容,再去掉行尾多余空格,生成符合要求的简洁格式。 - 错误兼容:保留原命令的错误跳转逻辑,执行失败时自动清理临时文件并返回错误码,保证脚本健壮性。
内容的提问来源于stack exchange,提问作者Vandana
相关产品推荐
相关产品推荐

