【发布时间】:2016-03-18 15:09:06
【问题描述】:
我在 PowerShell 中遇到一个问题,即从函数返回的 1 元素数组未作为数组返回。我发现很多地方都问过类似的问题(PowerShell: How can I to force to get a result as an Array instead of Object & How can I force Powershell to return an array when a call only returns one object?),但那里的解决方案对我不起作用。 这是我的代码:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
return @($levelMappings)
}
(x).gettype().name
返回
哈希表
我不希望这样,我希望返回的东西始终是一个数组,即使它只有一个元素。我知道我可以通过将函数的返回值显式转换为数组来解决这个问题:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
return @($levelMappings)
}
@(x).gettype().name
但我不想这样做。我希望函数每次都能可靠地返回一个数组。
对这个问题的早期草稿的答案建议我使用一元运算符,当我将结果通过管道传输到 ConvertTo-Json 时(这最终是我需要做的)except ) 那么我没有得到想要的结果。观察:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
$levelMappings += @{"e"="f";"g"="h"}
return ,$levelMappings
}
(x).gettype().name
x | ConvertTo-Json
运行结果如下:
{
“价值”:[
{
"c": "d",
"a": "b"
},
{
"g": "h",
“e”:“f”
}
],
“计数”:2
}
如您所见,我序列化为 JSON 的对象已包装在名为 value 的 JSON 对象中,我现在也有一个 count 对象。这不是我想要的。有什么办法解决吗?
另一个更新。我发现我可以将对函数的调用括在括号中,并且似乎可以解决它。
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b";"c"="d"}
$levelMappings += @{"e"="f";"g"="h"}
return ,$levelMappings
}
(x).gettype().name
(x) | ConvertTo-Json
返回
[
{
"c": "d",
"a": "b"
},
{
"g": "h",
“e”:“f”
}
]
它并不理想......但它确实有效。
第三次更新,不,这不起作用。如果它是一个 1 元素数组,我会回到原来的问题:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b"}
return ,$levelMappings
}
(x).gettype().name
(x) | ConvertTo-Json
给予:
{
"a": "b"
}
我放弃!!!
第四次更新...
哦,如果我将返回的值放入哈希表并将其转换为 json:
function x()
{
$levelMappings = @()
$levelMappings += @{"a"="b"}
return ,$levelMappings
}
$hashtable = @{}
$hashtable.Add('somekey',(x))
$hashtable | ConvertTo-Json
它显示为一个单元素 JSON 数组!
{
“一些关键”:[
{
"a": "b"
}
]
}
啊!!! :)
【问题讨论】:
-
return ,$levelMappings -
哦,真漂亮。非常感谢你。我确实认为这可能是一个骗局,但做了很多搜索却找不到任何东西。
-
@briantist 我确实在问题中解释了我的问题与那个问题的完全相同
标签: powershell