Как добавить столбец инкрементных значений в вывод командлета?
Предположим, я звоню 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] увеличивает результат приращения до области видимости канала, достигая того же результата, что и явное указание переменной как глобальной.