Powershell 管道将JSON转换为ForEach时的奇怪行为
为什么以下内容不迭代由Powershell 管道将JSON转换为ForEach时的奇怪行为,powershell,Powershell,为什么以下内容不迭代由convertfromjson返回的System.object[]数组的元素: ConvertFrom-Json '[1, 2, 3]' | ForEach-Object {": $_"} 但这确实: (ConvertFrom-Json '[1, 2, 3]') | ForEach-Object {": $_"} 在我看来,在第一种情况下,整个数组作为参数传递给ForEach,但原因我不清楚 更新:这似乎是Powershell中与阵列转换相关的错误,请参阅和
convertfromjson
返回的System.object[]
数组的元素:
ConvertFrom-Json '[1, 2, 3]' | ForEach-Object {": $_"}
但这确实:
(ConvertFrom-Json '[1, 2, 3]') | ForEach-Object {": $_"}
在我看来,在第一种情况下,整个数组作为参数传递给ForEach
,但原因我不清楚
更新:这似乎是Powershell中与阵列转换相关的错误,请参阅和。复制我的答案:
convertfromjson
在管道方面有一些奇怪的行为。问题在于convertfromjson
将Json数组包装在一个数组中,然后将整个数组作为一个项传递到管道中。在大多数情况下,这很好,但是如果最外层是JSON数组,那么整个数组将作为单个对象传递到管道中
比较:
PS> ConvertFrom-Json '[1, 2, 3]' | ForEach-Object {": $_"}
: 1 2 3
PS> (ConvertFrom-Json '[1, 2, 3]') | ForEach-Object {": $_"}
: 1
: 2
: 3
PS> $x = ConvertFrom-Json '[1, 2, 3]'
PS> $x | ForEach-Object {": $_"}
: 1
: 2
: 3
PS> ,$x | ForEach-Object {": $_"}
: 1 2 3
注意,在最后一个例子中,我们可以用一元逗号运算符来重复这个问题
PowerShell Core 6出现了这个问题。事实上,这很有趣,Ok,所以
$conv=convertfromJSON'[1,2,3]'$conv | ForEach{$\.gettype()}
按预期工作。为什么数组在变量赋值时被解包,而在管道化时却没有解包?这对我来说没有太多意义。与&{,(1,2,3)}%“${code>v&{(1,2,3)}}%“${(1,2,3)}deost bug相比,您指出的实际上是转换为Json
中的“bug”,而不是转换自Json
中的“bug”。此外,您所看到的行为与Json的转换无关。至少在我看来,这完全是意料之中的PowerShell行为<代码>函数f{,(1..5)};f |%GetType;(f) |%GetType