Найти в Дзене
inPowerShell

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

Каждый объект 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 - и задавать, какие дополнительные свойства и методы будут содержать объекты определенного типа, или то, как они будут отображаться. Однако в этой статье мы сосредоточимся исключительн
Оглавление

Каждый объект 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.