如何从FortifyClient命令输出中提取项目版本ID?
从Fortify CLI输出中提取项目版本ID的解决方案
我之前在做Fortify扫描自动化脚本时,也踩过CLI输出解析的坑,针对你现在的需求,这里有几个实用的方案,帮你精准提取目标ID:
方案一:纯批处理实现(无需额外工具)
Fortify的fortifyclient listProjectVersions输出一般是空格分隔的表格,表头第一行是列名,后面是数据行。我们可以用批处理的for /f命令分割文本,结合findstr过滤目标行:
@echo off setlocal enabledelayedexpansion :: 替换成你的Fortify服务器地址 set "fortify_url=https://your-fortify-server.com" :: 遍历输出,跳过表头行,提取第一列(ID)和剩余内容 for /f "skip=1 tokens=1,*" %%a in ('fortifyclient listProjectVersions -url %fortify_url% -user %user% -password %pwd%') do ( :: 检查当前行是否同时包含目标项目名和版本号 echo %%b | findstr /i /c:"%project%" | findstr /i /c:"%version%" >nul if !errorlevel! equ 0 ( set "target_version_id=%%a" goto :exit_loop :: 找到后直接跳出循环,提升效率 ) ) :exit_loop if defined target_version_id ( echo 成功提取项目版本ID:%target_version_id% ) else ( echo 未找到匹配的项目版本:%project%-%version% ) endlocal
关键说明:
skip=1:跳过表头行(第一行的ID/Project Name等列名)tokens=1,*:把每行的第一列(ID)存入%%a,剩余所有内容存入%%bfindstr /i:忽略大小写匹配,避免因大小写不一致漏匹配- 启用
enabledelayedexpansion是为了在循环里正确读取errorlevel的值
如果你的Fortify输出用制表符分隔列,需要把for /f的参数改成"skip=1 tokens=1,* delims=^t"(^t表示制表符,也可以直接在脚本里按Tab键输入)。
方案二:先过滤行再提取ID(更简洁的写法)
如果输出格式比较规整,也可以先用管道过滤出目标行,再提取第一列:
@echo off setlocal set "fortify_url=https://your-fortify-server.com" :: 先过滤掉表头,再匹配项目和版本,最后提取第一列ID for /f "tokens=1" %%a in (' fortifyclient listProjectVersions -url %fortify_url% -user %user% -password %pwd% ^ ^| findstr /v "ID" ^| findstr /i /c:"%project%" ^| findstr /i /c:"%version%" ') do ( set "target_version_id=%%a" ) echo 目标项目版本ID:%target_version_id% endlocal
注意点:
- 管道符号
|在for /f的命令字符串里需要加转义符^ findstr /v "ID":排除包含表头关键字的行
更优方案:用Fortify REST API(长期维护更可靠)
CLI的输出格式可能会随Fortify版本更新变化,而REST API返回的是结构化的JSON数据,解析起来更稳定。你可以结合curl和jq(Windows下可单独安装jq工具)实现:
@echo off setlocal set "fortify_url=https://your-fortify-server.com" set "token_file=fortify_token.txt" set "temp_response=project_versions.json" :: 1. 获取认证Token curl -s -X POST -H "Content-Type: application/json" ^ -d "{\"username\":\"%user%\",\"password\":\"%pwd%\"}" ^ %fortify_url%/api/v1/auth/tokens > %token_file% set /p auth_token=< %token_file% :: 2. 查询目标项目的版本列表,过滤指定版本并提取ID curl -s -H "Authorization: Bearer %auth_token%" ^ %fortify_url%/api/v1/projectVersions?project.name=%project% > %temp_response% :: 用jq解析JSON,提取匹配版本的ID for /f %%a in ('jq -r ".[] | select(.version==\"%version%\") | .id" %temp_response%') do ( set "target_version_id=%%a" ) echo 提取到的ID:%target_version_id% :: 清理临时文件 del %token_file% %temp_response% endlocal
为什么这是更优方案?
- JSON结构稳定,不会因为CLI输出的排版变化导致脚本失效
- 可以直接通过API参数过滤项目,无需遍历所有输出行,效率更高
- 后续扩展功能(比如上传扫描结果)也可以直接用API实现,更统一
内容的提问来源于stack exchange,提问作者reaper_unique
相关产品推荐
相关产品推荐

