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

То что PowerShell оперирует объектами предоставляет огромные возможности, но в тоже время иногда требует новых методов работы. Например команда Get-ChildItem (также известная как dir или ls) выдает массив объектов типа System.IO.FileSystemInfo. Но на экран выводятся лишь некоторые свойства этих объектов — Mode, LastWriteTime, Length и Name.

PS D:\PowerShell> dir


    Directory: Microsoft.PowerShell.Core\FileSystem::D:\PowerShell\tmp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        07.03.2007      8:05            foo
-a---        18.02.2007     14:28          2 1.txt
-a---        18.02.2007     14:28          2 2.txt
-a---        18.02.2007     14:28          2 3.txt
-a---        18.02.2007     14:28          2 4.txt
-a---        26.02.2007     21:39          3 foo.txt
-a---        09.03.2007      6:50        384 Get-WhoAmI.ps1

Однако на самом деле эти объекты содержат гораздо больше информации, просто PoSH по умолчанию отображает только заданный набор свойств (кстати эти наборы можно настроить самому для любых типов объектов).
Управлять выводимыми свойствами можно например с помощью командлетов Format-Table или Format-List. В качестве параметра они принимают список свойств которые необходимо показать. Причем поддерживаются и маски. Чтобы посмотреть все свойства объектов System.IO.FileSystemInfo мы сделаем следующее:

PS D:\PowerShell> dir | Format-List *

...

PSPath            : Microsoft.PowerShell.Core\FileSystem::D:\PowerShell\tmp\1.txt
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::D:\PowerShell\tmp
PSChildName       : 1.txt
PSDrive           : D
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : -a---
Name              : 1.txt
Length            : 2
DirectoryName     : D:\PowerShell\tmp
Directory         : D:\PowerShell\tmp
IsReadOnly        : False
Exists            : True
FullName          : D:\PowerShell\tmp\1.txt
Extension         : .txt
CreationTime      : 19.02.2007 8:12:47
CreationTimeUtc   : 19.02.2007 5:12:47
LastAccessTime    : 19.02.2007 8:12:47
LastAccessTimeUtc : 19.02.2007 5:12:47
LastWriteTime     : 18.02.2007 14:28:16
LastWriteTimeUtc  : 18.02.2007 11:28:16
Attributes        : Archive

...

Этот метод конечно позволяет детально рассмотреть объекты, но не слишком удобен если этих объектов много. Тут больше бы подошло форматирование в виде таблицы, тем более мы теперь знаем какие свойства есть у объекта, и можем выбрать лишь нужные. Возьмём к примеру имя файла и время создания, доступа, и изменения.

PS D:\PowerShell> dir | Format-Table name, *time -AutoSize

Name           CreationTime       LastAccessTime     LastWriteTime
----           ------------       --------------     -------------
foo            07.03.2007 8:05:43 13.03.2007 7:59:23 07.03.2007 8:05:43
1.txt          19.02.2007 8:12:47 19.02.2007 8:12:47 18.02.2007 14:28:16
2.txt          19.02.2007 8:12:47 19.02.2007 8:12:47 18.02.2007 14:28:16
3.txt          19.02.2007 8:12:47 19.02.2007 8:12:47 18.02.2007 14:28:16
4.txt          19.02.2007 8:12:46 19.02.2007 8:12:47 18.02.2007 14:28:16
foo.txt        27.02.2007 8:02:58 27.02.2007 8:04:43 26.02.2007 21:39:54
Get-WhoAmI.ps1 09.03.2007 8:02:56 09.03.2007 8:04:59 09.03.2007 6:50:49

Ключ -AutoSize указывает командлету что он сам должен подогнать ширину столбцов наилучим образом (при указании этого ключа Format-Table вынужден дождатся получения всего набора данных).

Кроме того можно очень детально настроить отображение, и даже добавить столбцы содержимое которых будет наполнятся какой-либо командой. Детально останавливаться пока не буду, но например:

PS D:\PowerShell> dir | Format-Table @{Label="Имя"; Expression={$_.name}; "Width"=10},
>> @{Label="Дата создания"; Expression={"{0:d}" -f $_.creationTime}; Align="left"; Width=15},
>> @{Label="Размер (Кб)"; E={"$($_.length/1kb) Kb"}; A="Left"}
>>

Имя        Дата создания   Размер (Кб)
---        -------------   -----------
foo        07.03.2007      0 Kb
1.txt      19.02.2007      0.001953125 Kb
2.txt      19.02.2007      0.001953125 Kb
3.txt      19.02.2007      0.001953125 Kb
4.txt      19.02.2007      0.001953125 Kb
foo.txt    27.02.2007      0.0029296875 Kb
Get-Who... 09.03.2007      0.375 Kb

Однако возможности работы с объектами конечно не ограничиваются форматированием вывода, о некоторых других возможностях попробую рассказать в следующих постах…

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