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
相关产品推荐
相关产品推荐

