假设我调用Get-Service
并希望为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
我正在尝试使用Select-Object
来添加此列,但我不太明白如何在这种表达式中迭代变量。这就是我所拥有的:
Get-Service |
Select-Object @{ Name = "ID" ; Expression= { } }, Status, Name, DisplayName |
Format-Table -Autosize
有没有办法在Expression= { }
内迭代整数,还是我错误地解决了这个问题?
答案 0 :(得分:8)
你可以这样做,虽然你需要在主表达式之外维护一些计数器变量。
$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
答案 1 :(得分: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] 限定符将增量的结果压缩到管道范围,从而获得与将变量明确指定为全局相同的结果。