gpt4 book ai didi

PowerShell 应该从管道返回 object[] 吗?

转载 作者:行者123 更新时间:2023-12-04 00:42:44 25 4
gpt4 key购买 nike

鉴于此功能:

> function Get-ArrayOfArrays() {
(1,2),(3,4) | % { $_ }
}

我希望返回类型是一个数组数组。但是,内部数组似乎正在扩展到管道中:

> Get-ArrayOfArrays | % { $_.GetType().Name }
Int32
Int32
Int32
Int32

事实上,内联运行管道会产生这些结果:

> (1,2),(3,4) | % { $_ }
Object[]
Object[]

我发现如果我在 foreach 中使用 return 关键字,我可以获得想要的结果:

> function Get-ArrayOfArraysWithReturn() {
(1,2),(3,4) | % { return $_ }
}

> Get-ArrayOfArraysWithReturn | % { $_.GetType().Name }
Object[]
Object[]

这种行为似乎是“如果从带有未捕获对象的函数返回,并且这些对象恰好是数组,则展开它们”。这是那些“大部分时间做最有用的事情”的设计决策之一吗?还是我遗漏了什么?

最佳答案

(1,2),(3,4) | % {$_}

导致您的函数输出 (1,2) 和 (3,4) - 与此函数相同:

function foo { 
1,2
3,4
}

最重要的是,作为函数输出对象过程的一部分,这些数组中的每一个都再次展开(展平)它们的内容,例如:

PS> foo | %{$_.GetType().Name}
Int32
Int32
Int32
Int32

这类似于您执行此操作时在主机上看到的内容:

PS> 1,2
1
2

展开数组,显示数组的每个元素。以下应该做你想做的:

function Get-ArrayOfArrays() { 
(1,2),(3,4)
}

当 (1,2),(3,4) 命中函数输出时,它被展开一次,输出 (1,2) 和 (3,4)。另一种可用于解决集合展开问题的技术是使用 , 运算符将一个集合包装在另一个单个元素集合中,以保留原始集合的形状,例如:

PS> function foo { ,((1,2),(3,4)) }
PS> foo | gtn
Object[]

关于PowerShell 应该从管道返回 object[] 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2411659/

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