首页 > 解决方案 > 为什么 select-object -first 1 不返回数组以保持一致性?

问题描述

当我将一些对象通过管道传递给select-object -first n它时,它会返回一个数组,除非n是 1:

PS C:\> (get-process | select-object -first 1).GetType().FullName
System.Diagnostics.Process

PS C:\> (get-process | select-object -first 2).GetType().FullName
System.Object[]

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

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

这是为什么?

标签: powershell

解决方案


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

  1. 由于我们要求“-first 1”,因此我们期望单个项目。
  2. 如果我们收到一个数组/列表,我们仍然需要索引第一个来获取那个,这几乎就是“Select-Object -First 1”的设计目的(在这种情况下)。
  3. 结果总是可以包装在@() 中以强制一个数组——也许在我们已经计算了“-First $N”并且实际上并不知道(在代码中的那一刻)我们可能只收到的情况下1.
  4. 设计师/开发人员认为应该是这样。

#3使它不会成为问题:

$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.

推荐阅读