gpt4 book ai didi

powershell - 自动数组包装/展开的规则是什么?

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

考虑这个代码:

$a = '[{"a":"b"},{"c":"d"}]'
"Test1"
$a | ConvertFrom-Json | ForEach-Object { $_.GetType() }
"Test2"
$b = $a | ConvertFrom-Json
$b | ForEach-Object { $_.GetType() }

这会产生以下输出:
Test1

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Test2
True False PSCustomObject System.Object
True False PSCustomObject System.Object

显然,如果我们使用一个临时变量,那么管道中传递的任何东西都与我们不使用它时传递的东西不同。

我想知道 powershell 用于自动数组包装/解包的规则是什么,如果我们需要遍历 json 数组,那么使用临时变量是否是最佳操作方法。

更新 1
逻辑上 ConvertFrom-Json应该返回一个给定输入的数组和 ForEach-Object应该在上述数组上迭代。然而,在第一次测试中,这不会发生。为什么?
更新 2
有没有可能是 ConvertFrom-Json具体的?喜欢错误/问题?

最佳答案

关于管道项目的解包只有一个规则:写入管道的所有数组和集合总是被解包到项目中(“解包一层”或“以非递归方式解包”是更正确的说法但为了简单起见,到目前为止我们不考虑嵌套数组)。

仍然有可能通过使用一元逗号运算符来覆盖此行为:

$a = 1,2
$a | ForEach-Object{ $_.GetType() }

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
True True Int32 System.ValueType

,$a | ForEach-Object{ $_.GetType() }

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

在第二种情况下,Powershell 管道引擎打开 $a但后来结果被 , 包裹回数组运算符(operator)。

至于 ConvertFrom-Json我个人认为它的观察行为更可预测,因为它允许您默认捕获整个 JSON 数组。
如果您对细节感兴趣,功能 Get-WrappedArray在下面的代码中模仿 ConvertFrom-Json的行为:
function Get-WrappedArray {
Begin { $result = @() }
Process { $result += $_ }
End { ,$result }
}

$a | Get-WrappedArray | ForEach-Object{ $_.GetType() }

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

$b = $a | Get-WrappedArray
$b | ForEach-Object{ $_.GetType() }

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
True True Int32 System.ValueType

关于powershell - 自动数组包装/展开的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725057/

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