Добавляем пользовательские типы данных к объектам PowerShell

Каждый объект PowerShell принадлежит к какому-либо типу данных. Например, объект процесса — это экземпляр типа System.Diagnostics.Process.

Get-Process | Get-Member
   TypeName: System.Diagnostics.Process
...

Объекты, являющиеся результатом выполнения команд PowerShell, уже принадлежат к определенному типу данных, однако это не мешает нам добавить к ним нужный нам собственный тип.

Еще более полезной эта возможность становится при работе с пользовательскими объектами — System.Management.Automation.PSCustomObject.

[PSCustomObject]@{
    Name = 'Object'
    Description = 'Object Description'
}

Для чего это нужно?

Если мы укажем, что определенные объекты принадлежат к некоторому собственному, пользовательскому типу, мы затем сможем ссылаться на него в файлах типов — types.ps1xml, а также форматов — format.ps1xml — и задавать, какие дополнительные свойства и методы будут содержать объекты определенного типа, или то, как они будут отображаться.

Однако в этой статье мы сосредоточимся исключительно на методах указания типов данных и не будем затрагивать назначение и структуру файлов типов и форматов.

PSTypeNames

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

Мы уже видели из первого примера, что в этом нам может помочь командлет Get-Member. Однако он отображает только наиболее точно определенный тип объекта, не указывая иерархию наследования. Посмотреть, наследником каких типов является некий объект мы сможем, обратившись к свойству pstypenames.

Стоит отметить, что, поскольку свойство pstypenames является скрытым, то завершение ввода с использованием клавиши Tab или сочетания клавиш Ctrl+Пробел в данном случае работать не будет.

$Process = Get-Process -Id $pid
$Process.pstypenames
System.Diagnostics.Process
System.ComponentModel.Component
System.MarshalByRefObject
System.Object

То же касается и объектов типа PSCustomObject.

$PSCustomObject = [PSCustomObject]@{
    Name = 'Object'
    Description = 'Object Description'
}
​
$PSCustomObject.pstypenames
System.Management.Automation.PSCustomObject
System.Object

Add-Member

Одним из способов добавления типа данных к объекту является командлет Add-Member.

$PSCustomObject | Add-Member -TypeName 'CustomType'
$PSCustomObject.pstypenames
CustomType
System.Management.Automation.PSCustomObject
System.Object

Type collection

Также мы можем работать напрямую со значением свойства pstypenames, чей тип данных является наследником коллекции строк. Соответственно, нам доступны следующие методы: Add, Insert, Remove, RemoveAt и Clear.

Add

$PSCustomObject.pstypenames.Add("AnotherCustomType")
$PSCustomObject.pstypenames
CustomType
System.Management.Automation.PSCustomObject
System.Object
AnotherCustomType

Remove

$PSCustomObject.pstypenames.Remove("AnotherCustomType")
$PSCustomObject.pstypenames
CustomType
System.Management.Automation.PSCustomObject
System.Object

RemoveAt

$PSCustomObject.pstypenames.RemoveAt(0)
$PSCustomObject.pstypenames
System.Management.Automation.PSCustomObject
System.Object

Insert

$PSCustomObject.pstypenames.Insert(0, "AnotherCustomType")
$PSCustomObject.pstypenames
AnotherCustomType
System.Management.Automation.PSCustomObject
System.Object

Clear

$PSCustomObject.pstypenames.Clear()
$PSCustomObject.pstypenames

PSTypeName property

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

$PSCustomObject = [PSCustomObject]@{
    Name = 'Object'
    Description = 'Object Description'
    PSTypeName = 'OneMoreCustomType'
}
​
$PSCustomObject
Name   Description
----   -----------
Object Object Description
$PSCustomObject.pstypenames
OneMoreCustomType
System.Management.Automation.PSCustomObject
System.Object

Return

В этой статье мы рассмотрели несколько вариантов указания пользовательских типов данных для объектов, что является одним из шагов, позволяющих нам расширить доступный для использования набор типов и форматов в PowerShell.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s