Выбор свойств 2

Format-Table и Format-List форматируют отображение объектов в консоли, однако иногда бывает необходимо выбрать некоторые свойства объектов для экспорта например в csv или для дальнейшей обработки. Тут поможет командлет Select-Object или просто Select. Работа с ним похожа на работу с Format- командлетами, и даже результат его работы выводится на экран похожим образом, однако на самом деле он выдает новые объекты с указанными свойствами.

PS D:\PowerShell> dir | Select name, length

Name           length
----           ------
foo
1.txt          2
2.txt          2
3.txt          2
4.txt          2
foo.txt        3
Get-WhoAmI.ps1 384

Посмотрим свойства объекта:

PS D:\PowerShell> dir | Select name, length | Get-Member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       System.Boolean Equals(Object obj)
GetHashCode Method       System.Int32 GetHashCode()
GetType     Method       System.Type GetType()
ToString    Method       System.String ToString()
length      NoteProperty  length=null
Name        NoteProperty System.String Name=foo

Как видно по результату, Select-Object просто создал новые объекты на базе оригиналов. И свойства этих объектов ограничены теми что мы перечислили.

Подобно Format- командлетам, в Select-Object можно похожим образом настроить свойства, и даже добавить свои. Например мы добавим свойство shortName, в котором будет имя файла без расширения, а также оставим два оригинальных свойства — Name и Extension.

PS D:\PowerShell> dir | Select name, extension, @{Name="ShortName"; Expression={$_.Name.substring(0,$_.name.Length-$_.Extension.length)}}

Name           Extension ShortName
----           --------- ---------
foo                      foo
1.txt          .txt      1
2.txt          .txt      2
3.txt          .txt      3
4.txt          .txt      4
foo.txt        .txt      foo
Get-WhoAmI.ps1 .ps1      Get-WhoAmI

Следует обратить внимание что это новое свойство будет добавлено только к этим экземплярам объектов. Их конечно можно сохранить в переменную, подвергнуть их дальнейшей обработке, и т.п.

PS D:\PowerShell> $objs = dir | Select name, extension, @{Name="ShortName"; Expression={$_.Name.substring(0,$_.name.Length-$_.Extension.length)}}

PS D:\PowerShell> $objs | where {$_.ShortName -match "^\d+$"}

Name  Extension ShortName
----  --------- ---------
1.txt .txt      1
2.txt .txt      2
3.txt .txt      3
4.txt .txt      4

Но что если мы хотим чтобы это свойство добавилось ко всем объектам типа System.IO.FileSystemInfo? Тут пригодится одна фишка PoSH'а под названием Extended Type System. Про неё тоже попробую потом вкратце рассказать.

Опубликовано в PowerShell. Комментарии к записи Выбор свойств 2 отключены
%d такие блоггеры, как: