【问题标题】:How do I add a column of incrementing values to cmdlet output?如何将一列递增值添加到 cmdlet 输出?
【发布时间】:2013-08-09 05:48:51
【问题描述】:

假设我调用 Get-Service 并希望分配一个新列 ID 与打印递增整数的 cmdlet 输出,以便:

ID  Status Name                            DisplayName
--  ------ ----                            -----------
 0 Running AdobeARMservice                 Adobe Acrobat Update Service
 1 Stopped AeLookupSvc                     Application Experience
 2 Stopped ALG                             Application Layer Gateway Service

我现在正在尝试使用Select-Object 添加此列,但我不太明白如何在这种表达式中迭代变量。这是我得到的:

Get-Service |
Select-Object @{ Name = "ID" ; Expression= {  } }, Status, Name, DisplayName |
Format-Table -Autosize

有没有办法在Expression= { } 中迭代整数,还是我解决这个问题的方式不对?

【问题讨论】:

    标签: powershell cmdlets


    【解决方案1】:

    您可以这样做,但您需要在主表达式之外维护一些计数器变量。

    $counter = 0
    Get-Service |
    Select-Object @{ Name = "ID" ; Expression= {$global:counter; $global:counter++} }, Status, Name, DisplayName |
    Format-Table -Autosize
    

    另一种选择,可能更干净

    Get-Service `
    |% {$counter = -1} {$counter++; $_ | Add-Member -Name ID -Value $counter -MemberType NoteProperty -PassThru} `
    | Format-Table ID
    

    【讨论】:

      【解决方案2】:

      我问了same question a different way,得到了如下答案

      $x = 10
      Get-Service |
      Select-Object @{ Name = "ID" ; Expression={ (([ref]$x).Value++) }}, Status, Name, DisplayName | Format-Table -Autosize
      

      我完全不清楚该表达式是在 Select-Object 的范围内调用的,而不是在管道的范围内。 [ref] 限定符将增量的结果提升到管道的范围,实现与显式将变量指定为全局相同的结果。

      【讨论】:

      • 我更喜欢这个解决方案,而不是明确命名一个范围。在大多数情况下,使用 Global 通常不是一件好事,而且其他范围并不总是那么容易显式引用。这个“技巧”确实会造成危险,因为它会修改它在通过可访问范围时找到的第一个变量,但只要你知道它不能以某种方式在错误的范围内抓取一个变量,它就非常优雅。
      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      相关资源
      最近更新 更多