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