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

在PowerShell中解析IBM API Connect的YAML文件(无第三方依赖)

更简洁的PowerShell方案提取YAML中的API路径

既然不能用第三方YAML解析库,我们可以用更精准的正则匹配或者逐行处理的方式,避免多次繁琐的字符串替换。这里提供两种简洁的实现思路:

方法1:精准正则直接提取

利用正则的正向/反向预查锁定apis到plans的代码块,再直接匹配$ref后的路径值:

# 读取整个YAML文件为单字符串
$yamlContent = Get-Content -Path "C:\Users\abhi\Desktop\projects\TRYG\GitLab\APIPOC\test.yaml" -Raw

# 提取apis块内所有$ref对应的路径
$apiPaths = [regex]::Matches($yamlContent, '(?<=apis:)([\s\S]+?)(?=plans:)') | 
    ForEach-Object { [regex]::Matches($_.Groups[0].Value, '(?<=\$ref:\s*")([^"]+)') } | 
    ForEach-Object { $_.Value }

# 输出结果
$apiPaths

逻辑说明:

  1. (?<=apis:)([\s\S]+?)(?=plans:):匹配apis:之后、plans:之前的所有内容(包括换行)
  2. 再在这个子内容里用(?<=\$ref:\s*")([^"]+)匹配$ref: "之后、下一个双引号之前的字符串,直接拿到路径

方法2:逐行遍历(更易读)

如果觉得正则太抽象,逐行处理的方式逻辑更直观,适合后续维护:

$lines = Get-Content -Path "C:\Users\abhi\Desktop\projects\TRYG\GitLab\APIPOC\test.yaml"
$inApisBlock = $false
$apiPaths = @()

foreach ($line in $lines) {
    # 进入apis块标记
    if ($line -match '^apis:') {
        $inApisBlock = $true
        continue
    }
    # 离开apis块,终止循环
    if ($line -match '^plans:') {
        $inApisBlock = $false
        break
    }
    # 在apis块内时,提取$ref的路径
    if ($inApisBlock -and $line -match '\$ref:\s*"([^"]+)"') {
        $apiPaths += $matches[1]
    }
}

# 输出结果
$apiPaths

逻辑说明:

  1. 遍历每一行,通过$inApisBlock标记是否处于apis代码块内
  2. 进入块后,只要遇到包含$ref的行,就用正则提取引号内的路径值
  3. 遇到plans:就停止处理,避免多余计算

这两种方法都不需要多次字符串替换,代码更简洁、逻辑更清晰,而且能精准提取你需要的所有API YAML路径。

内容的提问来源于stack exchange,提问作者abhi88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:27:34