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