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

PowerShell的for循环操作JSON数组时对象被覆盖的原因及解决方法

问题原因

通过ConvertFrom-Json生成的自定义对象属于PowerShell中的引用类型。你在循环外仅初始化了一次$jsonParamObj实例,后续每次向par数组追加元素时,实际添加的都是同一个对象的内存引用,而非独立的新对象。因此循环中修改任意下标对应的对象属性,都会修改原始的同一个实例,最终所有数组元素都指向同一个对象,显示的是最后一次修改的结果。

解决方法

核心逻辑为每次循环都生成独立的新参数对象,避免复用同一个引用实例。两种可行实现方案如下:

方案1:将参数模板实例化逻辑移入循环

每次循环都重新解析JSON模板,生成全新的参数对象:

$ArrayOfArguments = @("Param1", "Param2", "Param3")
$ArrayOfArgumentDescriptions = @("Description1", "Description2", "Description3")

$jsonData = @"
{
  "foo": {
    "des": "foo-des",
    "par": [],
    "sig": "foo-sig"
  }
}
"@

$jsonObj = $jsonData | ConvertFrom-Json

# add param
for($i=0; $i -lt $ArrayOfArguments.count; $i++){
    # 每次循环生成新的参数对象
    $jsonParamData = @"
    {
      "des": "param-des",
      "name": "param-name"
    }
"@
    $jsonParamObj = $jsonParamData | ConvertFrom-Json
    $jsonParamObj.name = $ArrayOfArguments[$i]
    $jsonParamObj.des = $ArrayOfArgumentDescriptions[$i]
    $jsonObj.foo.par += $jsonParamObj
}

$jsonResult = $jsonObj | ConvertTo-Json -Depth 5
Write-Host $jsonResult

方案2:直接构造自定义对象(更简洁)

无需复用JSON模板,直接在循环中创建PSCustomObject添加到数组:

$ArrayOfArguments = @("Param1", "Param2", "Param3")
$ArrayOfArgumentDescriptions = @("Description1", "Description2", "Description3")

$jsonData = @"
{
  "foo": {
    "des": "foo-des",
    "par": [],
    "sig": "foo-sig"
  }
}
"@

$jsonObj = $jsonData | ConvertFrom-Json

# add param
for($i=0; $i -lt $ArrayOfArguments.count; $i++){
    $jsonObj.foo.par += [PSCustomObject]@{
        des = $ArrayOfArgumentDescriptions[$i]
        name = $ArrayOfArguments[$i]
    }
}

$jsonResult = $jsonObj | ConvertTo-Json -Depth 5
Write-Host $jsonResult

两种方案执行后都可以得到你预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:39:03