gpt4 book ai didi

powershell - 为什么管道对转换后的 json 对象不起作用?

转载 作者:行者123 更新时间:2023-12-04 17:14:02 25 4
gpt4 key购买 nike

考虑以下代码:

$data = '[
{
"Name": "banana",
"Color": "yellow"
},
{
"Name": "kiwi",
"Color": "green"
},
{
"Name": "apple",
"Color": "red"
}
]'
# Returns 3 objects while only 1 was expected
$data | ConvertFrom-Json | Where-Object { $_.Name -eq 'banana' }

# Workaround, returns 1 object as expected:
($data | ConvertFrom-Json) | Where-Object { $_.Name -eq 'banana' }
为什么不能使用第一个选项?好像是 Where-Object从 json 转换对象后,函数不正确。这发生在 PowerShell 版本 5.1 .
我们在这里遗漏了一些明显的东西吗?

最佳答案

和:

$data | ConvertFrom-Json | Where-Object { $_.Name -eq 'banana' }
发生以下情况:
  • ConvertFrom-Json返回一个对象数组(它本身就是一个对象)。因为这是第一个(最终也是唯一的)“完成”对象 ConvertFrom-Json返回,它作为一个整体沿管道向下传递。请记住,一个 cmdlet 通常可以返回多个对象数组。
  • 所以,Where-Object在这种情况下只接收一个对象(包含三个元素的整个数组)。 $_然后引用整个数组,而不是每个元素。因此,$_.Name不返回一个元素的名称,而是返回所有元素名称的列表。此外,术语 $_.Name -eq 'banana'在这种情况下不是 bool 表达式,而是元素名称的过滤列表(该列表仅包含“香蕉”)。只要列表不为空,它就会被评估为 $true来自 Where-Object因此,您的整个数组(一个对象,具有三个元素)将进一步通过管道传输(在您的情况下打印)。因此,它不会像您假设的那样返回三个对象,而是返回一个包含三个对象的对象。

  • 相比之下,您的另一行:
    ($data | ConvertFrom-Json) | Where-Object { $_.Name -eq 'banana' }
    好吧,简而言之,做你期望它做的事情。为什么?因为圆括号破坏了管道。由于有括号,括号内的所有内容都将被完全评估,然后再通过管道传输。在您的括号被评估后,有一个数组,它将被进一步传送。整个数组将逐个元素通过管道传输。所以在这种情况下, Where-Object接收三个单个对象,就像您预期的那样。

    另一个很好的例子是这样的:
    您不能覆盖当前正在阅读的文件:
    Get-Content test.txt | Set-Content test.txt
    但是你可以在读完文件后覆盖它:
    (Get-Content test.txt) | Set-Content test.txt

    关于powershell - 为什么管道对转换后的 json 对象不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69008776/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com