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

PowerShell中用foreach循环解析JSON生成精简文件报错求助

问题分析与解决方案

你的代码存在几个关键问题导致循环报错:

  1. 错误的迭代对象:你尝试遍历$jsonInput.PSObject.Properties,但$jsonInput是原始JSON字符串,不是解析后的对象。应该遍历$inputObj.vulnerabilities.PSObject.Properties,这才是包含各个漏洞包的集合。
  2. 无效的哈希表语法:在[pscustomobject]@{}内部直接写foreach循环是PowerShell不支持的语法,无法动态生成键值对。
  3. 冗余的属性获取:使用Get-Member获取属性是多余的,直接通过迭代对象的Value属性即可访问漏洞详情。
  4. 动态键赋值错误:'$($property.Name)' = ...的写法无法正确解析动态键名,应该通过哈希表先收集键值对,再转换为自定义对象。

修正后的代码

$jsonInput=@"
{
    "auditReportVersion": 2,
    "vulnerabilities": {
        "@babel/traverse": {
            "name": "@babel/traverse",
            "severity": "critical",
            "isDirect": false,
            "via": [
                {
                    "source": 1094446,
                    "name": "@babel/traverse",
                    "dependency": "@babel/traverse",
                    "title": "Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code",
                    "url": "https://github.com/advisories/GHSA-67hx-6x53-jw92",
                    "severity": "critical",
                    "cwe": [
                        "CWE-184",
                        "CWE-697"
                    ],
                    "cvss": {
                        "score": 9.3,
                        "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H"
                    },
                    "range": "<7.23.2"
                }
            ],
            "effects": [],
            "range": "<7.23.2",
            "nodes": [
                "node_modules/@babel/traverse"
            ],
            "fixAvailable": true
        }
    }
}"@

$inputObj = $jsonInput | ConvertFrom-Json

# 初始化哈希表存储处理后的漏洞数据
$processedVulnerabilities = @{}

# 遍历每个漏洞包
foreach ($vulnProperty in $inputObj.vulnerabilities.PSObject.Properties) {
    $vulnDetails = $vulnProperty.Value
    # 提取指定字段生成精简对象
    $trimmedVuln = [pscustomobject]@{
        name = $vulnDetails.name
        severity = $vulnDetails.severity
        range = $vulnDetails.range
        fixAvailable = $vulnDetails.fixAvailable
    }
    # 将精简对象添加到哈希表,键为包名
    $processedVulnerabilities[$vulnProperty.Name] = $trimmedVuln
}

# 构建最终输出对象
$outputObj = [pscustomobject]@{
    auditReportVersion = $inputObj.auditReportVersion
    vulnerabilities = [pscustomobject]$processedVulnerabilities
}

# 转换为JSON并保存
$outputObj | ConvertTo-Json -Depth 4 | Out-File .\trimmed_vulnerabilities.json

关键修改说明

  • 遍历正确的对象:通过$inputObj.vulnerabilities.PSObject.Properties获取所有漏洞包的属性集合,每个属性的Name是包名(如@babel/traverse),Value是该包的漏洞详情。
  • 使用哈希表收集动态键值对:先创建空哈希表,在循环中逐个添加处理后的漏洞对象,最后将哈希表转换为自定义对象赋值给vulnerabilities字段。
  • 直接提取所需字段:从每个漏洞详情对象中直接读取name、severity等字段,无需额外的属性查找操作,代码更简洁高效。
  • 正确的JSON深度设置:使用-Depth 4确保转换为JSON时不会丢失嵌套结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:17:42