Как выясняется не все знают о функции «…»😉 Дело в том что её нет в стандартной поставке PowerShell, хотя многие разработчики (и не только) её давно используют🙂 Вот источник и оригинал функции — http://blogs.msdn.com/powershell/archive/2006/10/21/Power-and-Pith.aspx

Что же эта штука делает? Она выбирает из передаваемых по конвейеру объектов одно свойство, и отдает его дальше. (Не путать с Select-Object! Он создает новый объект PSObject с выбранными свойствами.)

Когда это может быть полезно? Ну например…

Команда Get-History возвращает список последних введенных команд, но это не просто массив строчек, а полноценные объекты, с определенными свойствами:

PS C:\PowerShell> Get-History

  Id CommandLine
  -- -----------
   1 dir
   2 ps | select name, cpu
   3 cls
   4 dir *ps1 | select -First 5
   5 cls

Кстати все свойства не показываются по умолчанию:

PS C:\PowerShell> Get-History | ft * -AutoSize

Id CommandLine                ExecutionStatus StartExecutionTime  EndExecutionTime
-- -----------                --------------- ------------------  ----------------
 1 dir                              Completed 16.12.2007 14:19:41 16.12.2007 14:19:42
 2 ps | select name, cpu            Completed 16.12.2007 14:19:51 16.12.2007 14:19:52
 3 cls                              Completed 16.12.2007 14:19:56 16.12.2007 14:19:56
 4 dir *ps1 | select -First 5       Completed 16.12.2007 14:20:13 16.12.2007 14:20:14
 5 cls                              Completed 16.12.2007 14:20:18 16.12.2007 14:20:18
 6 Get-History                      Completed 16.12.2007 14:20:21 16.12.2007 14:20:21

Но если нам надо просто получить например последние 5 команд и поместить их в текстовый файл? Ну чтобы сделать скрипт по следам интерактивной работы:

PS C:\PowerShell> Get-History | ForEach {$_.CommandLine} | Set-Content test.ps1

Эта команда возьмет от каждого элемента лишь значение свойства CommandLine и передаст его дальше.

Но так как такие преобразования приходится делать очень часто — функция «…» становится очень полезной🙂

PS C:\PowerShell> Get-History | ... CommandLine | Set-Content test.ps1

И еще, немножко другой вариант применения. Когда вам необходимо получить одно свойство одного объекта.

PS C:\PowerShell> (Get-Process explorer).CPU
2849,4674657
PS C:\PowerShell> (Measure-Command {dir c:\windows\System32}).TotalSeconds
5,7744383

Но при интерактивной работе так раздражает возвращать курсор в начало выражения, только для того чтобы поставить там открывающую скобку… Думаю многие меня поймут🙂

PS C:\PowerShell> Get-Process explorer | ... cpu
2854,6466989
PS C:\PowerShell> Measure-Command {dir c:\windows\System32} |... TotalSeconds
5,8138356

Ну и собственно само объявление этой волшебной полезняшки:

${function:...}={process {$Object=$_; $args[0]|%{$Object.($_)}}}

Эта функция немного отличается от оригинала, — я добавил возможность выбирать сразу несколько свойств (указав их через запятую, в виде массива). Хотя она и однострочная — она не выглядит очень простой🙂 Если будет интересно как она устроена — обязательно расскажу подробно, а пока можно просто скопировать её себе в профиль и начать использовать🙂

Опубликовано в PowerShell. 4 комментария »

комментария 4 to “…”

  1. Evgeny_Fedyakov Says:

    Очень полезная функция
    Спасибо

  2. Xaegr Says:

    2 Evgeny_Fedyakov:
    Не за что🙂 Без неё было бы очень тяжко🙂
    Жаль она не включена в стандартные…

  3. Get-Currency.Ps1 « PowerShell и другие скрипты Says:

    […] если используется эта полезная функция, то вот […]

  4. Иногда кавычки имеют значение « PowerShell и другие скрипты Says:

    […] если вы используете вот эту классную функцию, то еще […]


Обсуждение закрыто.

%d такие блоггеры, как: