使用批处理脚本提取XML文件中特定测试结果数据
从多个XML文件提取指定标签值的批处理方案
推荐方案:批处理结合PowerShell(可靠稳定)
批处理本身对XML的结构化解析支持有限,借助Windows自带的PowerShell可以精准提取目标值,以下是可直接运行的脚本:
@echo off setlocal enabledelayedexpansion :: 匹配当前目录下所有XML文件,可修改为指定路径(如 "D:\test\*.xml") set "xml_files=*.xml" :: 存储所有文件的提取结果 set "results=" for %%f in (%xml_files%) do ( :: 调用PowerShell解析XML,通过XPath定位目标标签 for /f "delims=" %%r in ('powershell -Command "$xml = [xml](Get-Content '%%f'); $xml.SelectSingleNode('//TestResults[@index=''Sensor1'']/Passed').InnerText"') do ( set "current_result=%%f: %%r" set "results=!results!!current_result!^n" :: 实时打印当前文件的结果 echo !current_result! ) ) :: 输出所有结果,也可将结果写入文件(如 echo !results! > output.txt) echo. echo 所有提取结果汇总: echo !results! endlocal
脚本说明
enabledelayedexpansion确保循环中变量能正确更新- XPath表达式
//TestResults[@index='Sensor1']/Passed精准定位index="Sensor1"的TestResults标签下的Passed子标签 - 提取的结果会存入
results变量,同时打印到控制台,也可直接写入文件保存
备选方案:纯批处理(仅适用于格式严格的XML)
如果环境限制无法使用PowerShell,可尝试纯批处理方法,但仅当XML格式完全规范(标签无跨行、嵌套)时有效:
@echo off setlocal enabledelayedexpansion set "xml_files=*.xml" set "results=" for %%f in (%xml_files%) do ( set "in_target_section=" for /f "tokens=* delims=" %%l in (%%f) do ( :: 检测是否进入目标TestResults标签 echo %%l | findstr /i "<TestResults index=\"Sensor1\">" >nul if not errorlevel 1 set "in_target_section=1" :: 在目标区域内提取Passed标签的值 if defined in_target_section ( echo %%l | findstr /i "<Passed>" >nul if not errorlevel 1 ( set "line=%%l" :: 通过字符串替换剥离标签,提取true/false set "line=!line:*<Passed>=!" set "result=!line:</Passed>=!" set "current_result=%%f: !result!" set "results=!results!!current_result!^n" echo !current_result! :: 提取完成后退出当前标签区域 set "in_target_section=" ) ) ) ) echo. echo 所有提取结果汇总: echo !results! endlocal
注意事项
- 纯批处理方法依赖XML的排版格式,若
Passed标签跨行、存在额外属性或缩进混乱,会导致提取失败 - 优先推荐PowerShell方案,兼容性和可靠性更强
内容的提问来源于stack exchange,提问作者Cristine
相关产品推荐
相关产品推荐

