You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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,剩余所有内容存入%%b
  • findstr /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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:17