Командлеты Format-* и Select-Object

Я попробую еще пояснить по поводу этих команд. Может показатся что они работают одинаково:

PS D:\PowerShell> dir | format-table name, length
 
Name           length
----           ------
foo
1.txt          2
2.txt          2
3.txt          2
4.txt          2
 
PS D:\PowerShell> dir | select name, length
 
Name           length
----           ------
foo
1.txt          2
2.txt          2
3.txt          2
4.txt          2
 

но это далеко не так… Эти командлеты выполняют совершенно разные действия, и их вывод тоже очень отличается… Иногда он просто выглядит похоже😉
Попытаюсь обьяснить разницу между ними…

Серия командлетов Format-* (Format-Table, Format-List и тд) делает именно то что следует из названия — форматирует объекты для отображения их на консоли. То есть изменяет их отображение на экране. Можно отобразить их в виде таблицы, а можно в виде списка (бывает полезно в случае длинных значений или имён свойств):

PS D:\PowerShell> dir | format-list name, length
 
Name : foo
 
Name   : 1.txt
Length : 2
 
Name   : 2.txt
Length : 2
 
Name   : 3.txt
Length : 2
 
Name   : 4.txt
Length : 2
 

Format-Table можно дать команду автоматически подобрать размер столбцов по размерам данных добавив ключ -AutoSize. Можно включить перенос строк (вместо обрезания) ключем -wrap, или отобразить объекты сгруппированными по свойству…

PS D:\PowerShell> dir | Format-Table name, length, psIsContainer -GroupBy psIsContainer -AutoSize
 
   PSIsContainer: True
 
Name length PSIsContainer
---- ------ -------------
foo                  True
 
   PSIsContainer: False
 
Name  length PSIsContainer
----  ------ -------------
1.txt 2              False
2.txt 2              False
3.txt 2              False
4.txt 2              False
 

Обратите внимание на разницу в ширине колонки Name — она подобрана автоматически благодоря -AutoSize
Вобщем Format- это именно форматирование вывода. Это уже не исходные объекты а лишь информация о том что и как надо отобразить на экране. В этом можно убедиться с помощью Get-Member:

PS D:\PowerShell> dir | format-table name, length | Get-Member -MemberType *property
 
   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
 
Name                                    MemberType Definition
----                                    ---------- ----------
autosizeInfo                            Property   Microsoft.PowerShell.Commands.I...
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   System.String ClassId2e4f51ef21...
groupingEntry                           Property   Microsoft.PowerShell.Commands.I...
pageFooterEntry                         Property   Microsoft.PowerShell.Commands.I...
pageHeaderEntry                         Property   Microsoft.PowerShell.Commands.I...
shapeInfo                               Property   Microsoft.PowerShell.Commands.I...

 
   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
 
Name                                    MemberType Definition
----                                    ---------- ----------
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   System.String ClassId2e4f51ef21...
groupingEntry                           Property   Microsoft.PowerShell.Commands.I...
shapeInfo                               Property   Microsoft.PowerShell.Commands.I...
...
 

Тут уже не содержится никаких свойств оригинального объекта, лишь информация для системы форматирования… То есть если попытатся вывести отформатированную таким образом информацию в файл — ничего хорошего вы не получите🙂

Но совсем другое дело Select-Object (или просто Select).

PS D:\PowerShell> dir | select name, length | Get-Member -MemberType *property
 

   TypeName: System.Management.Automation.PSCustomObject
 
Name   MemberType   Definition
----   ----------   ----------
length NoteProperty  length=null
Name   NoteProperty System.String Name=foo
 

Select-Object создает из имеющегося объекта, новый, почти такойже, только с указанными свойствами. Далее с этим объектом можно делать всё тоже самое что и с оригинальным. Например вывести в файл разделенный запятыми (csv):

PS D:\PowerShell> dir | select name, length | Export-Csv file.csv

Короче говоря если командлеты Format-* занимаются форматированием и выводом на экран, то Select-Object выбирает указанные объекты и их свойства. Вот еще несколько примеров:

PS D:\PowerShell> get-process | select name, *MemorySize -First 3
 
Name                     : Acrobat
NonpagedSystemMemorySize : 13544
PagedMemorySize          : 67780608
PagedSystemMemorySize    : 136636
PeakPagedMemorySize      : 70238208
PeakVirtualMemorySize    : 207654912
PrivateMemorySize        : 67780608
VirtualMemorySize        : 202731520
 
Name                     : acrotray
NonpagedSystemMemorySize : 2280
PagedMemorySize          : 778240
PagedSystemMemorySize    : 30808
PeakPagedMemorySize      : 811008
PeakVirtualMemorySize    : 34914304
PrivateMemorySize        : 778240
VirtualMemorySize        : 29847552
 
Name                     : Adobelm_Cleanup.0001
NonpagedSystemMemorySize : 1640
PagedMemorySize          : 483328
PagedSystemMemorySize    : 18128
PeakPagedMemorySize      : 1269760
PeakVirtualMemorySize    : 18706432
PrivateMemorySize        : 483328
VirtualMemorySize        : 18321408
 

Сейчас я выбрал первые три процесса, и оставил им свойства Name и все заканчивающиеся на MemorySize. Теперь можно например вывести их в csv:

PS D:\PowerShell> get-process | select name, *MemorySize -First 3 | export-csv processes.csv
 

Или посмотреть на часть из этих свойств в виде таблицы:

PS D:\PowerShell> get-process | select name, *MemorySize -First 3 | Format-Table name, private*, paged* -AutoSize -Wrap
 
Name     PrivateMemorySize PagedMemorySize PagedSystemMemorySize
----     ----------------- --------------- ---------------------
acrotray           1511424         1511424                 32980
alg                2134016         2134016                 37504
ccApp              5869568         5869568                 42456
Опубликовано в PowerShell. Комментарии к записи Командлеты Format-* и Select-Object отключены
%d такие блоггеры, как: