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

PowerShell中调用与被调用方法返回值不一致问题排查

问题描述

Get-JsonFileContent函数生成JSON内容写入D:\one.json时内容符合预期,但调用它的GenerateJsonModule函数将返回值写入D:\two.json时,文件开头多出了与include块数量相同的数字。

函数代码如下:

function Get-JsonFileContent {    
    param(        
        [System.Collections.ArrayList]$objects
    )

    $includeBlocks = [System.Collections.ArrayList]@();    

    if ($null -ne $objects -and $objects.ToString() -ne '' -and $objects.psobject.properties.count -gt 0) {
        foreach ($obj in $objects) {            
            if ($null -ne $obj -and $null -ne $obj.Name -and $obj.Name.Trim() -ne '' -and $obj.Name.Length -gt 0) {
                
                $include = @"                {
                    "name": "$($obj.Name)",                    
                    "age": "$($obj.Age)"                                       
                }
"@
                $includeBlocks.Add($include);
            }            
        }
    } 
    $content = @"    {
        "items": {
            "includes": [
                $($includeBlocks -join ",")
            ]
        }
    }
"@
    Set-Content -Force -Path "D:\one.json" -Value $content;
    return $content;
}

function GenerateJsonModule {    
    .....
    ....
    $jsonFileContent = Get-JsonFileContent -objects $objects;
    Set-Content -Force -Path "D:\two.json" -Value $jsonFileContent;
}

one.json输出符合预期:

{
        "items": {
            "includes": [
                                {
                    "name": "John Doe",
                    "age": "30"                     
                },                {
                    "name": "Jane Doe",
                    "age": "40"                                       
                }
            ]
        }
    }

two.json的输出异常(开头多出对应include块数量的数字):

0
1
2
3
4
5
{
            "items": {
                "includes": [
                                    {
                        "name": "John Doe",
                        "age": "30"                     
                    },                {
                        "name": "Jane Doe",
                        "age": "40"                                       
                    }
                ]
            }
        }
原因分析

问题出在$includeBlocks.Add($include)这一行:

  • [System.Collections.ArrayList]的Add()方法会返回新增元素的索引值(从0开始的整数)。
  • PowerShell函数的返回机制是:所有未被捕获或重定向的输出都会被纳入返回值集合,而不仅仅是return语句指定的内容。
  • 每次调用Add()时,返回的索引数字都会被作为函数输出的一部分,和最后return $content的JSON字符串一起被返回给调用者,最终写入two.json时就会把这些数字放在开头。
解决方法

只需要捕获或丢弃Add()方法的返回值即可,有两种常用方式:

方式1:将返回值赋值给$null

修改$includeBlocks.Add($include);为:

$null = $includeBlocks.Add($include);

方式2:用[void]抑制输出

修改$includeBlocks.Add($include);为:

[void]$includeBlocks.Add($include);

这样函数就只会返回你预期的JSON字符串,写入two.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:37:33