about_Types.ps1xml
Краткое описание
Описание использования Types.ps1xml
файлов для расширения типов объектов, используемых в PowerShell.
Подробное описание
Данные расширенного типа определяют дополнительные свойства и методы ("члены") типов объектов в PowerShell. Существует два способа добавления данных расширенного типа в сеанс PowerShell.
Types.ps1xml
file: XML-файл, определяющий данные расширенного типа.Update-TypeData
: командлет, который перезагрузитTypes.ps1xml
файлы и определяет расширенные данные для типов в текущем сеансе.
В этом разделе описываются Types.ps1xml
файлы. Дополнительные сведения об использовании командлета Update-TypeData
для добавления данных динамического расширенного типа в текущий сеанс см. в разделе Update-TypeData.
Сведения о данных расширенного типа
Данные расширенного типа определяют дополнительные свойства и методы ("члены") типов объектов в PowerShell. Вы можете расширить любой тип, поддерживаемый PowerShell, и использовать добавленные свойства и методы таким же образом, как и свойства, определенные в типах объектов.
Например, PowerShell добавляет свойство DateTime ко всем System.DateTime
объектам, таким как возвращаемые командлетом Get-Date
.
(Get-Date).DateTime
Sunday, January 29, 2012 9:43:57 AM
Свойство DateTime не будет находиться в описании структуры System.DateTime, так как PowerShell добавляет свойство и отображается только в PowerShell.
PowerShell внутренне определяет набор расширенных типов по умолчанию. Эти сведения о типе загружаются в каждом сеансе PowerShell при запуске. Свойство DateTime является частью этого набора по умолчанию. До PowerShell 6 определения типов были сохранены Types.ps1xml
в каталоге установки PowerShell ($PSHOME
).
Добавление данных расширенного типа в PowerShell
В сеансах PowerShell существует три источника данных расширенного типа.
Данные расширенного типа определяются PowerShell и загружаются автоматически в каждый сеанс PowerShell. Начиная с PowerShell 6 эти сведения компилируются в PowerShell и больше не отправляются в
Types.ps1xml
файл.Файлы
Types.ps1xml
, экспортируемые модулями, загружаются при импорте модуля в текущий сеанс.Данные расширенного типа, определенные с помощью командлета
Update-TypeData
, добавляются только в текущий сеанс. Он не сохраняется в файле.
В сеансе данные расширенного типа из трех источников применяются к объектам одинаково и доступны для всех объектов указанных типов.
Командлеты TypeData
Следующие командлеты включены в модуль Microsoft.PowerShell.Utility в PowerShell 3.0 и более поздних версий.
Get-TypeData
: получает данные расширенного типа в текущем сеансе.Update-TypeData
: перезагружаетTypes.ps1xml
файлы. Добавляет данные расширенного типа в текущий сеанс.Remove-TypeData
: удаляет данные расширенного типа из текущего сеанса.
Дополнительные сведения об этих командлетах см. в разделе справки для каждого командлета.
Встроенные файлы Types.ps1xml
Файлы Types.ps1xml
в $PSHOME
каталоге добавляются автоматически в каждый сеанс.
Файл Types.ps1xml
в каталоге установки PowerShell ($PSHOME
) — это XML-текстовый файл, который позволяет добавлять свойства и методы в объекты, используемые в PowerShell. В PowerShell есть встроенные Types.ps1xml
файлы, добавляющие несколько элементов в типы .NET, но можно создать дополнительные Types.ps1xml
файлы для дальнейшего расширения типов.
Например, по умолчанию объекты массива (System.Array
) имеют свойство Length , которое содержит количество объектов в массиве. Тем не менее, поскольку длина имени явно не описывает свойство, PowerShell добавляет свойство псевдонима с именем Count, которое отображает то же значение. Следующий XML-код добавляет свойство Count в System.Array
тип.
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>
Length
</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
Чтобы получить новый ПсевдонимProperty, используйте Get-Member
команду в любом массиве, как показано в следующем примере.
Get-Member -InputObject (1,2,3,4)
Команда возвращает следующие результаты.
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
Address Method System.Object& Address(Int32)
Clone Method System.Object Clone()
CopyTo Method System.Void CopyTo(Array array, Int32 index):
Equals Method System.Boolean Equals(Object obj)
Get Method System.Object Get(Int32)
# ...
В результате можно использовать свойство Count или свойство Length массивов в PowerShell. Например:
(1, 2, 3, 4).count
4
(1, 2, 3, 4).length
4
Создание новых файлов Types.ps1xml
.ps1xml
Файлы, установленные с помощью PowerShell, имеют цифровую подпись, чтобы предотвратить изменение, так как форматирование может включать блоки скриптов. Таким образом, чтобы добавить свойство или метод в тип .NET, создать собственные Types.ps1xml
файлы и добавить их в сеанс PowerShell.
Чтобы создать файл, начните с копирования существующего Types.ps1xml
файла. Новый файл может иметь любое имя, но у него должно быть .ps1xml
расширение имени файла. Новый файл можно поместить в любой каталог, доступный Для PowerShell, но удобно разместить файлы в каталоге установки PowerShell или$PSHOME
в подкаталоге каталога установки.
При сохранении нового файла используйте Update-TypeData
командлет, чтобы добавить новый файл в сеанс PowerShell. Если типы будут иметь приоритет над встроенными типами, которые определены, используйте параметр PrependData командлета Update-TypeData
. Update-TypeData
влияет только на текущий сеанс. Чтобы внести изменения во все будущие сеансы, экспортировать консоль или добавить Update-TypeData
команду в профиль PowerShell.
Types.ps1xml и add-member
Файлы Types.ps1xml
добавляют свойства и методы ко всем экземплярам объектов указанного типа .NET в затронутом сеансе PowerShell. Однако если необходимо добавить свойства или методы только к одному экземпляру Add-Member
объекта, используйте командлет.
Дополнительные сведения см. в разделе "Надстройка-член".
Пример. Добавление элемента age в объекты FileInfo
В этом примере показано, как добавить свойство Age в объекты System.IO.FileInfo . Возраст файла — это разница между временем создания и текущим временем в днях.
Так как свойство Age вычисляется с помощью блока скриптов, найдите <ScriptProperty>
тег, используемый в качестве модели для нового свойства Age.
Сохраните следующий XML-код в файл $PSHOME\MyTypes.ps1xml
.
<?xml version="1.0" encoding="utf-8" ?>
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>Age</Name>
<GetScriptBlock>
((Get-Date) - ($this.CreationTime)).Days
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Запустите Update-TypeData
, чтобы добавить новый Types.ps1xml
файл в текущий сеанс. Команда использует параметр PrependData для размещения нового файла в порядке приоритета выше исходных определений.
Дополнительные сведения см. в Update-TypeData
разделе Update-TypeData.
Update-Typedata -PrependPath $PSHOME\MyTypes.ps1xml
Чтобы проверить изменение, выполните Get-ChildItem
команду, чтобы получить файл PowerShell.exe в $PSHOME
каталоге, а затем передать файл Format-List
командлету, чтобы получить список всех свойств файла. В результате изменения свойство Age отображается в списке.
Get-ChildItem $PSHOME\pwsh.exe | Select-Object Age
142
XML-файл в файлах Types.ps1xml
Полное определение схемы можно найти в Types.xsd в репозитории исходного кода PowerShell на GitHub.
Тег <Types>
содержит все типы, определенные в файле. Должен быть только один <Types>
тег.
Каждый тип .NET, упомянутый в файле, должен быть представлен тегом <Type>
.
Теги типов должны содержать следующие теги:
<Name>
: заключает имя затронутого типа .NET.
<Members>
: заключает теги для новых свойств и методов, определенных для типа .NET.
Любой из следующих тегов-членов может находиться внутри тега <Members>
.
ПсевдонимProperty
Определяет новое имя существующего свойства.
Тег <AliasProperty>
должен иметь <Name>
тег, указывающий имя нового свойства и <ReferencedMemberName>
тег, указывающий существующее свойство.
Например, свойство count alias — это псевдоним для свойства Length объектов массива.
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>Length</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
CodeMethod
Ссылается на статический метод класса .NET.
Тег <CodeMethod>
должен иметь тег, указывающий <Name>
имя нового метода и <CodeReference>
тег, указывающий код, в котором определен метод.
Например, метод ToString — это имя определения кода Microsoft.PowerShell.ToStringCodeMethods .
<Type>
<Name>System.Xml.XmlNode</Name>
<Members>
<CodeMethod>
<Name>ToString</Name>
<CodeReference>
<TypeName>Microsoft.PowerShell.ToStringCodeMethods</TypeName>
<MethodName>XmlNode</MethodName>
</CodeReference>
</CodeMethod>
</Members>
</Type>
CodeProperty
Ссылается на статический метод класса .NET.
Тег <CodeProperty>
должен иметь тег, указывающий <Name>
имя нового свойства и <GetCodeReference>
тег, указывающий код, в котором определено свойство.
Например, свойство Mode объектов — это свойство System.IO.DirectoryInfo
кода, определенное в поставщике Файловой системы PowerShell.
<Type>
<Name>System.IO.DirectoryInfo</Name>
<Members>
<CodeProperty>
<Name>Mode</Name>
<GetCodeReference>
<TypeName>
Microsoft.PowerShell.Commands.FileSystemProvider
</TypeName>
<MethodName>Mode</MethodName>
</GetCodeReference>
</CodeProperty>
</Members>
</Type>
MemberSet
Определяет коллекцию элементов (свойств и методов).
Теги <MemberSet>
отображаются в основных <Members>
тегах. Теги должны заключать <Name>
тег, окружающий имя набора элементов и дополнительный <Members>
тег, окружающий элементы (свойства и методы) в наборе. Любой из тегов, создающих свойство (например <NoteProperty>
, или <ScriptProperty>
) или метод (например <Method>
, или <ScriptMethod>
) может быть членом набора.
В Types.ps1xml
файлах <MemberSet>
тег используется для определения представлений по умолчанию объектов .NET в PowerShell. В этом случае имя набора элементов (значение в <Name>
тегах) всегда является PsStandardMembers, а имена свойств (значение <Name>
тега) являются одним из следующих:
DefaultDisplayProperty
: одно свойство объекта.DefaultDisplayPropertySet
: одно или несколько свойств объекта.DefaultKeyPropertySet
: одно или несколько ключевых свойств объекта. Ключевое свойство определяет экземпляры значений свойств, например число идентификаторов элементов в журнале сеансов.
Например, следующий XML определяет отображение служб (System.ServiceProcess.ServiceController
объектов), возвращаемых командлетом Get-Service
по умолчанию. Он определяет набор элементов с именем PsStandardMembers , состоящий из набора свойств по умолчанию и свойства отображения по умолчанию. Он определяет свойство по умолчанию в качестве свойств Status, Name и DisplayName . Он определяет свойство отображения по умолчанию в качестве имени.
<Type>
<Name>System.ServiceProcess.ServiceController</Name>
<Members>
<MemberSet>
<Name>PSStandardMembers</Name>
<Members>
<PropertySet>
<Name>DefaultDisplayPropertySet</Name>
<ReferencedProperties>
<Name>Status</Name>
<Name>Name</Name>
<Name>DisplayName</Name>
</ReferencedProperties>
</PropertySet>
<NoteProperty>
<Name>DefaultDisplayProperty</Name>
<Value>Name</Value>
</NoteProperty>
</Members>
</MemberSet>
</Members>
</Type>
<Method>
: ссылается на собственный метод базового объекта.
<Methods>
: коллекция методов объекта.
ПримечаниеProperty
Определяет свойство со статическим значением.
Тег <NoteProperty>
должен иметь <Name>
тег, указывающий имя нового свойства и <Value>
тег, указывающий значение свойства.
Например, следующий XML создает свойство Status для объектов System.IO.DirectoryInfo . Значение свойства Status всегда имеет значение Success.
<Type>
<Name>System.IO.DirectoryInfo</Name>
<Members>
<NoteProperty>
<Name>Status</Name>
<Value>Success</Value>
</NoteProperty>
</Members>
</Type>
PropertySet
Свойства, которые принимают аргументы и возвращают значение.
<Properties>
: коллекция свойств объекта.
<Property>
: свойство базового объекта.
<PropertySet>
: определяет коллекцию свойств объекта.
Тег <PropertySet>
должен иметь тег, указывающий <Name>
имя набора свойств и <ReferencedProperty>
тег, указывающий свойства. Имена свойств заключены в <Name>
тег.
<PropertySet>
В Types.ps1xml
тегах используются для определения наборов свойств для отображения объекта по умолчанию. Вы можете определить значения PsStandardMembers по умолчанию в <Name>
теге <MemberSet>
тега.
Например, следующий XML-код создает СвойствоSet с именем DefaultDisplayPropertySet с тремя ReferencedProperties.
<Type>
<Name>System.ServiceProcess.ServiceController</Name>
<Members>
<MemberSet>
<Name>PSStandardMembers</Name>
<Members>
<PropertySet>
<Name>DefaultDisplayPropertySet</Name>
<ReferencedProperties>
<Name>Status</Name>
<Name>Name</Name>
<Name>DisplayName</Name>
</ReferencedProperties>
</PropertySet>
</Members>
</MemberSet>
</Members>
</Type>
ScriptMethod
Определяет метод, значение которого является выходным результатом скрипта.
Тег <ScriptMethod>
должен иметь <Name>
тег, указывающий имя нового метода и <Script>
тег, который заключает блок скрипта, возвращающий результат метода.
Например, ConvertToDateTime
методы и ConvertFromDateTime
методы объектов управления (System.System.Management.ManagementObject
) — это методы скрипта, использующие ToDateTime
и ToDmtfDateTime
статические методы System.Management.ManagementDateTimeConverter
класса.
<Type>
<Name>System.Management.ManagementObject</Name>
<Members>
<ScriptMethod>
<Name>ConvertToDateTime</Name>
<Script>
[System.Management.ManagementDateTimeConverter]::ToDateTime($args[0])
</Script>
</ScriptMethod>
<ScriptMethod>
<Name>ConvertFromDateTime</Name>
<Script>
[System.Management.ManagementDateTimeConverter]::ToDmtfDateTime($args[0])
</Script>
</ScriptMethod>
</Members>
</Type>
ScriptProperty
Определяет свойство, значение которого является выходным результатом скрипта.
Тег <ScriptProperty>
должен иметь тег, указывающий <Name>
имя нового свойства и <GetScriptBlock>
тег, который заключает блок скрипта, возвращающий значение свойства.
Например, свойство VersionInfo объекта System.IO.FileInfo является свойством скрипта, которое приводит к использованию свойства FullName статического метода GetVersionInfo объектов System.Diagnostics.FileVersionInfo.
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>VersionInfo</Name>
<GetScriptBlock>
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
Дополнительные сведения см. в пакете SDK для Windows PowerShell.
Update-TypeData
Чтобы загрузить Types.ps1xml
файлы в сеанс PowerShell, выполните Update-TypeData
командлет. Если вы хотите, чтобы типы в файле были приоритетом над типами в встроенном Types.ps1xml
файле, добавьте параметр Update-TypeData
PrependData. Update-TypeData
влияет только на текущий сеанс. Чтобы внести изменения во все будущие сеансы, экспортировать сеанс или добавить Update-TypeData
команду в профиль PowerShell.
Исключения, возникающие в свойствах или добавлении свойств в Update-TypeData
команду, не сообщают об ошибках StdErr
. Это необходимо для подавления исключений, которые могут возникнуть во многих распространенных типах в процессе форматирования и вывода. При получении свойств .NET можно обойти подавление исключений с помощью синтаксиса метода, как показано в следующем примере:
"hello".get_Length()
Обратите внимание, что синтаксис метода можно использовать только с свойствами .NET. Свойства, добавленные при выполнении командлета Update-TypeData
, не могут использовать синтаксис метода.
Подписывание файла Types.ps1xml
Чтобы защитить пользователей Types.ps1xml
файла, вы можете подписать файл с помощью цифровой подписи. Дополнительные сведения см. в about_Signing.
См. также
PowerShell