Как добавить столбец инкрементных значений в вывод командлета?

Предположим, я звоню Get-Service и хотите назначить новый столбец 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= { }, или я иду об этой проблеме неправильно?

2 ответа

Решение

Вы можете сделать это таким образом, хотя вам нужно будет поддерживать некоторую переменную counter вне основного выражения.

$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-Object, а не в трубе. Квалификатор [ref] увеличивает результат приращения до области видимости канала, достигая того же результата, что и явное указание переменной как глобальной.

Другие вопросы по тегам