Новое прочтение старых сообщений: Get-Process | Dir (о ValueFromPipelineByPropertyName)

Многие MVP по PowerShell и члены группы разработчиков PowerShell помогают мне составлять оглавление нашего блога, фактически это означает, что я возвращаюсь назад и просматриваю все классные штуки[Г1] [a2] , опубликованные в блоге PowerShell за несколько последних лет. Я получаю редкое удовольствие от процесса самообразования и, кстати, когда мы это закончим, в нашем блоге будет гораздо проще что-нибудь найти.

Я стараюсь не отвлекаться и собирать оглавление, вместо того, чтобы комментировать предыдущие сообщения, но некоторые вещи слишком хороши, чтобы устоять.

Например, посмотрите на это сообщение от 17 сентября 2006 г:

Get-Process | Dir

В сообщении говорится кое-что о том, как на самом деле можно передать в Get-Item много интересных штук, о которых было неизвестно, как их передать, но ничего не сказано о том, как работает этот кусочек магии PowerShell.

Если это коммандлет или расширенная фунукция, можно указать для параметров атрибут ValueFromPipeline (что приведет к получению из конвейера объекта целиком), можно также получать элемент из конвейера по имени свойства. Поскольку Get-Process имеет свойство Path, и параметр Path у Get-ChildItem помечен как ValueFromPipelineByPropertyName, он использует свойство Path каждого объекта процесса в качестве параметра пути каждого Get-ChildItem.

Зная это вы можете, например, получить все каталоги, в которых находятся запущенные процессы. Вот, посмотрите:


 Get-Process |
    Get-Item -ErrorAction SilentlyContinue |
    Group-Object Directory |
    Sort-Object Count -Descending

 

PowerShell прекрасен.

Надеюсь, это вам поможет,

Джеймс Брандейдж (James Brundage) [MSFT]

Перевод: Виктор Горбунков