【问题标题】:Strange behavior when piping converted JSON into ForEach管道将 JSON 转换为 ForEach 时的奇怪行为
【发布时间】:2018-03-07 02:47:38
【问题描述】:

为什么下面不遍历ConvertFrom-Json返回的System.object[]数组的元素:

 ConvertFrom-Json '[1, 2, 3]'   | ForEach-Object  {": $_"}

但确实如此:

(ConvertFrom-Json '[1, 2, 3]')  | ForEach-Object  {": $_"}

在我看来,在第一种情况下,整个数组作为参数传递给ForEach,但我不清楚原因。

更新:这似乎是 Powershell 中与数组转换相关的错误,请参阅 here here

【问题讨论】:

  • 确实,这很有趣puu.sh/ump6h/bb33b203fc.png
  • 好的,$conv = ConvertFrom-Json '[1, 2, 3]'; $conv | ForEach {$_.gettype()} 按预期工作。为什么数组在变量赋值期间被解包,但在管道时却没有?这对我来说没有多大意义。
  • 比较&{,@(1,2,3)}|% "$_" v &{@(1,2,3)}|% "$_"
  • @deorst 错误,您指出的实际上是ConvertTo-Json 中的“错误”,而不是ConvertFrom-Json 中的“错误”。此外,您看到的行为尤其与 ConvertFrom-Json 无关。至少在我看来,PowerShell 的行为完全符合预期。 function f {,(1..5)}; f | % GetType; (f) | % GetType

标签: powershell


【解决方案1】:

复制我的回答here

ConvertFrom-Json 对管道有一些奇怪的行为。问题在于ConvertFrom-Json 将 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 报告了此问题 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2021-04-01
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多