Powershell 如何向cmdlet输出中添加一列递增值?

Powershell 如何向cmdlet输出中添加一列递增值?,powershell,cmdlets,Powershell,Cmdlets,假设我调用并希望使用cmdlet输出分配一个新列ID,该输出打印递增整数,以便: ID Status Name DisplayName -- ------ ---- ----------- 0 Running AdobeARMservice Adobe Acrobat Update Service 1 Stopped AeLookupSvc

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

ID  Status Name                            DisplayName
--  ------ ----                            -----------
 0 Running AdobeARMservice                 Adobe Acrobat Update Service
 1 Stopped AeLookupSvc                     Application Experience
 2 Stopped ALG                             Application Layer Gateway Service
我正在尝试使用现在添加此列,但我不太明白如何在这种表达式中迭代变量。以下是我得到的:

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

有没有一种方法可以在
表达式={}
中迭代整数,或者我是不是用错误的方法解决了这个问题?

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

$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
我问了一个问题,得到了以下答案

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

我根本不清楚表达式是在Select对象的范围内调用的,而不是在管道的范围内调用的。[ref]限定符将增量的结果提升到管道的作用域,从而获得与显式指定变量为全局变量相同的结果。

我更喜欢这种解决方案,而不是显式指定作用域。在大多数情况下,使用Global通常不是一件好事,而且其他作用域并不总是那么容易显式引用。这个“把戏”确实会带来危险,因为它会在穿过可访问的作用域时修改它找到的第一个变量,但只要你知道它不能在错误的作用域中获取一个变量,它就相当优雅了。