gpt4 book ai didi

powershell - ConvertFrom-Json 的不同评估

转载 作者:行者123 更新时间:2023-12-02 23:36:35 29 4
gpt4 key购买 nike

为什么以下两个片段会产生不同的输出?

Get-Content -Raw "test.json" | ConvertFrom-Json | %{
Write-Output "MessageType: $($_.Messagetype)"
}
# this time make sure Get-Content and ConvertFrom-Json are evaluated completely, before the foreach
(Get-Content -Raw "test.json" | ConvertFrom-Json) | %{
Write-Output "MessageType: $($_.Messagetype)"
}

使用以下 json 执行代码片段:
[
{
"MessageType": "A"
},
{
"MessageType": "B"
}
]

第一个脚本产生
MessageType: A B

第二个是预期的
MessageType: A
MessageType: B

所以基本上对于第一个片段,foreach 得到一个元素,它是一个包含 2 个元素的数组,而在第二个片段中,每个元素都调用了 foreach。

我不明白为什么强制评估完全改变了这里的行为。

最佳答案

在 PowerShell 版本中 直到 v6.x,ConvertFrom-Json ,与大多数其他 cmdlet 不同,将数组输出为单个对象 ,而不是通过管道一一发送对象。
因此,在您的第一个命令的 % ( ForEach-Object ) 脚本 block ,$_是整个数组,在可扩展字符串 ( "..." ) 内,默认情况下将其字符串化为由空格分隔的元素列表。
相比之下,将命令包含在 () 中, grouping operator , 将其转换为表达式,并在管道中使用表达式隐式导致表达式结果的枚举 ,导致对象被一个一个发送。
注意:使用 () 的另一个显着副作用是一个封闭的命令的输出被完整地收集在内存中。
因此,您的第二个命令的 % ( ForEach-Object ) 脚本 block 被调用两次,$_每个都绑定(bind)到一个对象。
简化示例:

# Sample JSON that is an array comprising 2 objects.
$json = '[
{
"MessageType": "A"
},
{
"MessageType": "B"
}
]'

# PS v6.x-: -> 1, because ConvertFrom-Json sent the array as a whole
$json | ConvertFrom-Json | Measure-Object | % Count

# -> 2, because using (...) resulted in enumeration
($json | ConvertFrom-Json) | Measure-Object | % Count

关于powershell - ConvertFrom-Json 的不同评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53602313/

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