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

如何在PowerShell的foreach循环中替换占位符并生成正确JSON

问题:PowerShell中循环替换对象属性生成正确JSON字符串

现有包含Name和Age属性的obj对象,需要在foreach循环中替换属性占位符,让函数返回符合预期的JSON字符串。

原函数代码

function Get-JsonFileContent {    
    param(
        [System.Collections.ArrayList]$objects
    )
    $includeBlocks = [System.Collections.ArrayList]@();
    foreach ($obj in $objects) {
        $include = @"
                {
                    \"name\": \"$obj.Name\",
                    \"age\": \"$obj.Age\"                    
                }
    "@
      $includeBlocks.Add($include);
    }
  Write-Host $includeBlocks;
  return $($includeBlocks -join ",");
}

当前输出

{
    \"name\": @{Name=John Doe; Age=30}.Name,
    \"age\": @{Name=John Doe; Age=30}.Age
},
{
    \"name\": @{Name=Jane Doe; Age=40}.Name,
    \"age\": @{Name=Jane Doe; Age=40}.Age
}

期望输出

{
   \"name\": \"John Doe\",
   \"age\": \"30\"                    
},
{
   \"name\": \"Jane Doe\",
   \"age\": \"40\"                    
}

解决方法

方法1:修正字符串插值语法

问题出在PowerShell的变量解析逻辑:在Here-String中,$obj.Name会被解析为变量$obj拼接字符串.Name,而非获取$obj的Name属性值。需要用**子表达式$()**包裹属性访问,让PowerShell先计算属性值再插入字符串:

function Get-JsonFileContent {    
    param(
        [System.Collections.ArrayList]$objects
    )
    $includeBlocks = [System.Collections.ArrayList]@();
    foreach ($obj in $objects) {
        $include = @"
                {
                    \"name\": \"$($obj.Name)\",
                    \"age\": \"$($obj.Age)\"                    
                }
    "@
      $includeBlocks.Add($include);
    }
  Write-Host $includeBlocks;
  return $($includeBlocks -join ",");
}

方法2:使用内置ConvertTo-Json(推荐)

手动拼接JSON容易出现转义、格式错误,更可靠的方式是直接将对象转换为JSON:

function Get-JsonFileContent {    
    param(
        [System.Collections.ArrayList]$objects
    )
    # 将每个对象转换为指定结构的自定义对象,再转JSON
    $jsonItems = $objects | ForEach-Object {
        [PSCustomObject]@{
            name = $_.Name
            age = $_.Age
        } | ConvertTo-Json -Compress:$false
    }
    return $jsonItems -join ","
}

这种方式无需手动处理转义,PowerShell会自动处理所有JSON格式问题,结果更准确。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:24:57