【问题标题】:Why does select-object -first 1 not return an array for consistency?为什么 select-object -first 1 不返回数组以保持一致性?
【发布时间】:2019-12-29 05:21:32
【问题描述】:

当我通过管道将一些对象传递给 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】:

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

    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.
    

    【讨论】:

      【解决方案2】:

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

      $a = (get-process | select-object -first 1)
      $a | Get-Member
      
      $b = (get-process | select-object -first 2)
      ,$b | Get-Member
      

      【讨论】:

      • 这个答案的问题是,如果数组中有 2 个或更多项,它将同时获得前 2 个。请参阅我上面的答案以了解强制数组的标准方法,即换行@() 中的调用 -- @(Get-Process -first 1) 将返回一个数组,无论项目数如何,它甚至可以与 $n = Get-Random 3; @(Get-Process -first $n) # 它与 0、1 或 2 一起使用以始终返回一个数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2021-04-10
      • 2021-01-29
      • 2021-03-11
      相关资源
      最近更新 更多