Powershell 为什么select object-first 1不返回一致性数组?

Powershell 为什么select object-first 1不返回一致性数组?,powershell,Powershell,当我通过管道将一些对象选择为object-first n时,它将返回一个数组,除非n为1: 出于一致性原因,我希望两个管道都返回一个数组 显然,PowerShell选择将一个对象作为对象而不是作为数组中的元素返回 这是为什么?管道将返回[System.Diagnostics.Process]对象。在第一个示例中,它只是一个对象。第二个是[System.Diagnostics.Process]的[System.Object[]]数组 为什么在这种情况下,问题通常是不确定的,但主要归结为: 因为我们

当我通过管道将一些对象选择为object-first n时,它将返回一个数组,除非n为1:

出于一致性原因,我希望两个管道都返回一个数组

显然,PowerShell选择将一个对象作为对象而不是作为数组中的元素返回


这是为什么?

管道将返回[System.Diagnostics.Process]对象。在第一个示例中,它只是一个对象。第二个是[System.Diagnostics.Process]的[System.Object[]]数组


为什么在这种情况下,问题通常是不确定的,但主要归结为:

因为我们要的是第一个1,所以我们只需要一个项目。 如果我们收到一个数组/列表,我们仍然需要对第一个数组/列表进行索引,以仅获得该数组/列表,这与Select Object-first 1在这种情况下的作用非常相似。 结果总是可以包装在@中,以强制一个数组(可能是在我们计算的情况下)首先是$N,而在代码中,我们实际上不知道我们可能只收到1。 设计者/开发者认为应该是这样。 这是第三个使它不成为问题的原因:

$PSProcess = @(Get-Process PowerShell | Select -First 1)
…这将保证$PSProcces是一个数组,无论计数是多少

它甚至可以用于:

$n = Get-Random 3
@(Get-Process -first $n) # $n => 0, 1, or 2 but always returns an array.

这个答案的问题是,如果数组中有2个或更多项,它将同时获得前2个项。有关强制数组的标准方法,请参见上面的答案,即将调用包装在@-@Get进程中-第一个1将返回一个数组,无论项目的数量如何,因此它甚至可以使用$n=Get Random 3@Get Process—第一个$n它与0、1或2一起工作,以始终返回数组。
$PSProcess = @(Get-Process PowerShell | Select -First 1)
$n = Get-Random 3
@(Get-Process -first $n) # $n => 0, 1, or 2 but always returns an array.