PowerShell函数返回ArrayList转JSON出现多余元素问题排查
PowerShell函数返回ArrayList转JSON多元素的原因及解决
错误根源:ArrayList.Add()的返回值被混入函数输出
System.Collections.ArrayList的Add()方法会返回新添加元素的索引位置(比如第一个元素返回0,第二个返回1)。而PowerShell函数的默认行为是:所有未被抑制的命令输出,都会被收集到函数的返回结果中。
在你的封装函数里,当执行$arrayList.Add($hash)时,这个方法返回的索引值会和$arrayList对象一起,作为函数的返回内容,最终形成一个包含「索引整数」和「ArrayList」的混合数组。转JSON时,自然会把这两个整数也包含进去,就出现了多余的0、1元素。
为什么无函数的代码正常?
无函数时,Add()返回的索引值只是直接打印到控制台,并没有被存入你要转JSON的变量里。你最终转JSON的只是纯净的ArrayList对象,所以结果正常。
解决方法:抑制Add()的返回值
只需要把Add()的返回值丢弃,不让它进入函数的返回流即可,两种常用写法:
方法1:用$null接收返回值
function XYZ { $arrayList = New-Object System.Collections.ArrayList $null = $arrayList.Add(@{Name="Test1"; Value="Value1"}) $null = $arrayList.Add(@{Name="Test2"; Value="Value2"}) return $arrayList } # 调用后转JSON (XYZ) | ConvertTo-Json
方法2:用[void]抑制输出
function XYZ { $arrayList = New-Object System.Collections.ArrayList [void]$arrayList.Add(@{Name="Test1"; Value="Value1"}) [void]$arrayList.Add(@{Name="Test2"; Value="Value2"}) return $arrayList } # 调用后转JSON (XYZ) | ConvertTo-Json
这样函数返回的就只有纯净的ArrayList对象,转JSON时就不会出现多余的元素了。
内容的提问来源于stack exchange,提问作者JHah
相关产品推荐
相关产品推荐

