РАЗДЕЛ about_Types.ps1xml КРАТКОЕ ОПИСАНИЕ Описывает, как с помощью файлов Types.ps1xml расширить типы Microsoft .NET Framework объектов, используемых в Windows PowerShell. ПОЛНОЕ ОПИСАНИЕ Файл Types.ps1xml в каталоге установки Windows PowerShell ($pshome) - это текстовый файл на основе XML, позволяющий добавлять свойства и методы к объектам, использующимся в Windows PowerShell. Windows PowerShell содержит встроенный файл Types.ps1xml, добавляющий к типам .NET несколько элементов. Для большего расширения типов можно создавать дополнительные файлы Types.ps1xml. Например, по умолчанию объекты массивов (System.Array) имеют свойство Length, которое указывает количество объектов в массиве. Но так как название "length" (длина) описывает свойство недостаточно четко, Windows PowerShell добавляет свойство-псевдони м под названием "Count" (количество), отображающее то же значение. Следующий фрагмент XML добавляет к типу System.Array свойство Count. <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName> Length </ReferencedMemberName> </AliasProperty> </Members> </Type> Чтобы получить новое свойство AliasProperty, примените команду 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 ) ... В результате в Windows PowerShell можно использовать свойство массивов Count или свойство Length. Пример: C:\PS> (1, 2, 3, 4).count 4 C:\PS> (1, 2, 3, 4).length 4 Создание новых файлов Types.ps1xml Файлы PS1XML, устанавливаемые вместе с Windows PowerShell, имеют цифровую подпись, защищающую их от искажения, поскольку форматирование может включать блоки скриптов. Поэтому, чтобы добавить к типу .NET Framework свойство или метод, создавайте собственные файлы Types.ps1xml и добавляйте их в консоль Windows PowerShell. Для создания нового файла сначала скопируйте имеющийся файл Types.ps1xml. Новый файл может иметь любое имя, но он должен иметь расширение PS1XML. Новый файл можно поместить в любой каталог, доступный оболочке Windows PowerShell, однако рекомендуется помещать его в каталог установки Windows PowerShell ($pshome) или в подкаталог каталога установки. После сохранения добавьте новый файл с помощью командлета Update-TypeData в консоль Windows PowerShell. Если новые типы должны иметь приоритет перед типами, определенными во встроенном файле, следует использовать параметр PrependData командлета Update-TypeData. Действие командлета Update-TypeData распространяется только на текущую консоль. Чтобы изменение распространялось на все будущие консоли, экспортируйте консоль или добавьте команду Update-TypeData в профиль Windows PowerShell. Types.ps1xml и командлет Add-Member Файлы Types.ps1xml добавляют свойства и методы ко всем экземплярам объектов указанного типа .NET Framework в задействованной консоли Windows PowerShell. Если же нужно добавить свойства или методы только к одному экземпляру объекта, используйте командлет Add-Member. Дополнительные сведения см. в разделе Add-Member. Пример: добавление члена возраста в объекты FileInfo В данном примере показано, как добавить свойство Age к объектам файлов (System.IO.FileInfo). Возраст файла - это разница в днях между временем его создания и текущим временем. В качестве шаблона для нового файла проще всего использовать первоначальный файл Types.ps1xml. Следующая команда копирует первоначальный файл в файл MyTypes.ps1xml в каталоге $pshome. copy-item Types.ps1xml MyTypes.ps1xml Затем откройте файл Types.ps1xml в любом редакторе XML или текста, например в Блокноте. Так как свойство Age рассчитывается с помощью блока скрипта, найдите тег <ScriptProperty>, который будет использоваться как модель для нового свойства Age. Для создания свойства скрипта скопируйте XML между тегами кода <Type> и </Type>. Затем удалите оставшуюся часть файла, кроме открывающих тегов <?xml> и <Types> и закрывающего тега </Types>. Чтобы предотвратить возникновение ошибок, нужно удалить и цифровую подпись. Начните со свойства скрипта-модели, такого как следующее свойство скрипта, скопированное из первоначального файла Types.ps1xml. <?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.Guid</Name> <Members> <ScriptProperty> <Name>Guid</Name> <GetScriptBlock>$this.ToString()</GetScriptBlock> </ScriptProperty> </Members> </Type> </Types> Затем измените имя типа .NET Framework, имя свойства и значение блока скрипта, создав свойство Age для объектов файлов. <?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> Сохранив и закрыв файл, добавьте новый файл Types.ps1xml в текущую консоль с помощью команды Update-TypeData, такой как приведенная ниже. В этой команде используется параметр PrependData, чтобы задать для нового файла более высокий приоритет по сравнению с исходным файлом. (Дополнительные сведения о командлете Update-TypeData см. в разделе Update-TypeData.) update-typedata -prependpath $pshome\MyTypes.ps1xml Для проверки изменений используйте команду Get-ChildItem, чтобы вернуть файл PowerShell.exe в каталоге $pshome, а затем передайте файл по конвейеру командлету Format-List, чтобы получить список всех свойств файла. В результате изменений в списке появилось свойство Age. get-childitem $pshome\powershell.exe | format-list -property * PSPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS... PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS... PSChildName : powershell.exe PSDrive : C PSProvider : Microsoft.PowerShell.Core\FileSystem PSIsContainer : False Age : 16 VersionInfo : File: C:\WINDOWS\system32\WindowsPow... InternalName: POWERSHELL OriginalFilename: PowerShell.EXE ... Вывести свойство файла Age можно также с помощью следующей команды. (get-childitem $pshome\powershell.exe).age 16 XML в файлах Types.ps1xml Тег <Types> включает все типы, которые определены в файле. Должна быть только одна пара тегов <Types>. Каждый тип .NET Framework, отмеченный в файле, должен быть представлен парой тегов <Type>. Теги типов должны содержать следующие теги. <Name>: пара тегов <Name>, включающих имя задействованного .типа .NET Framework. <Members>: пара тегов <Members>, включающих теги для новых свойств и методов, определяемых для типа .NET Framework. Любые следующие теги членов могут находиться внутри тегов <Members>. <AliasProperty>: определяет новое имя существующего свойства. Тег <AliasProperty> должен иметь пару тегов <Name>, определяющих имя нового свойства, и пару тегов <ReferencedMemberName>, которые задают существующее свойство. Например, свойство-псевдоним Count - псевдоним свойства Length объектов массивов. <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName>Length</ReferencedMembe rName> </AliasProperty> </Members> </Type> <CodeMethod>: ссылается на статический метод класса .NET Framework. Тег <CodeMethod> должен иметь пару тегов <Name>, определяющих имя нового метода, и пару тегов <GetCodeReferenc e>, указывающих код, в котором определен метод. Например, свойство каталогов (объектов System.IO.DirectoryInf o) Mode - свойство кода, определенное в провайдере Windows PowerShell FileSystem. <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> <CodeProperty>: ссылается на статический метод класса .NET Framework. Тег <CodeProperty> должен иметь пару тегов <Name>, определяющих имя нового свойства, и пару тегов <GetCodeReference>, указывающих код, в котором определено свойство. Например, свойство каталогов (объектов System.IO.DirectoryInf o) Mode - свойство кода, определенное в провайдере Windows PowerShell FileSystem. <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 Framework в Windows PowerShell по умолчанию. В этом случае именем набора членов (значение в тегах <Name>) всегда является "PsStandardMembers", а имена свойств тега (значение <Name>) могут быть следующими. - DefaultDisplayProperty: одно свойство объекта. - DefaultDisplayPropertySet: одно или несколько свойств объекта. - DefaultKeyPropertySet:одно или несколько ключевых свойств объекта. Ключевое свойство определяет экземпляры значений свойств, такие как идентификационные номера элементов в журнале сеанса. Например, следующий фрагмент XML определяет вывод по умолчанию служб (объектов System.ServiceProcess.ServiceContro ller), которые возвращает командлет 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> </Members> </MemberSet> </Members> </Type> <Method>: ссылается на собственный метод основного объекта. <Methods>: коллекция методов объекта. <NoteProperty>: определяет свойство со статическим значением. Тег <NoteProperty> должен иметь пару тегов <Name>, определяющих имя нового свойства и пару тегов <Value>, определяющих значение свойства. Например, следующий фрагмент XML создает для каталогов (объектов System.IO.DirectoryInfo) свойство Status. Свойство Status всегда имеет значение "Success". <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <NoteProperty> <Name>Status</Name> <Value>Success</Value> </NoteProperty> </Members> </Type> <ParameterizedProperty>: свойства, принимающие аргументы и возвращающие значение. <Properties>: коллекция свойств объекта. <Property>: свойство базового объекта. <PropertySet>: определяет коллекцию свойств объекта. Тег <PropertySet> должен иметь пару тегов <Name>, определяющих имя набора свойств, и пару тегов <ReferencedProp erty>, определяющих свойства. Имена свойств заключены в пары тегов <Name>. В файле Types.ps1xml с помощью тегов <PropertySet> определяется набор свойств для отображения объекта по умолчанию. Отображение по умолчанию можно определить значением "PsStandardMembers" в теге <Name> тега <MemberSet>. Например, следующий фрагмент XML создает для каталогов (объектов System.IO.DirectoryInfo) свойство Status. Свойство Status всегда имеет значение "Success". <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.ManagementObje ct) - это методы- скрипты, использующие статические методы 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>, включающих блок скрипта, возвращающий значение свойства. Например, свойство файлов (объектов System.IO.FileInfo) VersionInfo - это свойство скрипта, которое получается в результате использования свойства FullName статического метода GetVersionInfo объектов System.Diagnostics.FileVersion Info. <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 в библиотеке MSDN (Microsoft Developer Network) по адресу https://go.microsoft.com/fwlink/?LinkId=144538. Update-TypeData Для загрузки файлов Types.ps1xml в консоль Windows PowerShell используется командлет Update-TypeData. Если типы в этом файле должны иметь приоритет перед типами во встроенном файле Types .ps1xml, следует использовать параметр PrependData командлета Update-TypeData. Действие командлета Update-TypeData распространяется только на текущую консоль. Чтобы изменение распространялось на все будущие консоли, экспортируйте консоль или добавьте команду Update-TypeData в профиль Windows PowerShell. Подпись файлов Types.ps1xml Для защиты пользователей файла Types.ps1xml его можно подписать с помощью цифровой подписи. Дополнительные сведения см. в разделе about_Signing. СМ. ТАКЖЕ about_Signing Copy-Item Get-Member Update-TypeData