主题
about_Types.ps1xml
简短说明
说明如何通过 Types.ps1xml 文件扩展 Windows PowerShell 中所用的 Microsoft .NET
Framework 类型的对象。
详细说明
Windows PowerShell 安装目录 ($pshome) 中的 Types.ps1xml 文件是基于 XML 的文本文件,通过该文件
可以将属性和方法添加到 Windows PowerShell 中的对象中。Windows PowerShell 有一个内置
Types.ps1xml 文件,该文件将多个元素添加到 Microsoft .NET Framework 类型中,不过,您可以创建其
他 Types.ps1xml 文件进一步扩展这些类型。
例如,默认情况下,数组对象 (System.Array) 有一个 Length 属性,用于列出数组中的对象数。但是,因为名
称"length"不能清楚描述该属性,所以 Windows PowerShell 添加了一个名为"Count"的别名属性来显示该
属性值。以下 XML 代码将 Count 属性添加到 System.Array 类型中:
<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 文件
与 Windows PowerShell 一起安装的 .ps1xml 文件经过了数字签名以防篡改(因为格式设置中可能包含脚
本块)。因此,若要将属性或方法添加到 .NET Framework 类型,请创建自己的 Types.ps1xml 文件,然后将这
些文件添加到 Windows PowerShell 控制台。
若要创建新文件,请从复制现有的 Types.ps1xml 文件入手。新文件可以使用任何名称,但其文件扩展名必须
为 .ps1xml。您可以将新文件放在 Windows PowerShell 可访问的任何目录中,但最好将这些文件放在
Windows PowerShell 安装目录 ($pshome) 或该安装目录的子目录中。
保存这些新文件之后,使用 Update-TypeData cmdlet 将新文件添加到 Windows PowerShell 控制台。
如果希望您的类型优先于内置文件中定义的类型,请使用 Update-TypeData cmdlet 的 PrependData 参数。
Update-TypeData 只影响当前控制台。要使更改应用于以后所有的控制台,请导出当前控制台,或者将
Update-TypeData 命令添加到 Windows PowerShell 配置文件。
Types.ps1xml 和 Add-Member
Types.ps1xml 文件在受影响的 Windows PowerShell 控制台中将属性和方法添加到具有指定 .NET
Framework 类型的对象的所有实例。不过,如果只需要将属性或方法添加到某个对象的一个实例,请使用 Add-
Member cmdlet。
有关详细信息,请参阅 Add-Member。
示例:向 FileInfo 对象添加 Age 成员
此示例说明如何将 Age 属性添加到文件对象 (System.IO.FileInfo)。文件的存在时间指当前时间与创建时间
之差(以天为单位)。
最简单的方法是将原始 Types.ps1xml 文件用作新文件的模板。以下命令将原始文件复制到 $pshome 目录中名
为 MyTypes.ps1xml 的文件中。
copy-item Types.ps1xml MyTypes.ps1xml
然后,使用任何 XML 或文本编辑器(如记事本)打开 Types.ps1xml 文件。因为 Age 属性是用脚本块计算
的,请找到 <ScriptProperty> 标记以用作新 Age 属性的模型。
复制代码中 <Type> 与 </Type> 标记之间的 XML,以创建脚本属性。然后,删除该文件的其余部分,但不要删
除 <?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()</GetScrip
tBlock>
</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>
在保存并关闭该文件后,使用 Update-TypeData 命令(如以下命令)将新的 Types.ps1xml 文件添加到当
前控制台。该命令使用 PrependData 参数以高于原始文件的优先级顺序放入新文件。(有关 Update-
TypeData 的详细信息,请参阅 Update-TypeData。)
update-typedata -prependpath $pshome\MyTypes.ps1xml
要测试更改,请使用 Get-ChildItem 命令获取 $pshome 目录中的 PowerShell.exe 文件,然后通过管道
将该文件传送到 Format-List cmdlet,以列出文件的所有属性。作为更改的结果,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
Types.ps1xml 文件中的 XML
文件中定义的所有类型都括在 <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> 标记,用于指定新方法的名称,还必须有一对
<GetCodeReference> 标记,用于指定定义该方法的代码。
例如,目录(System.IO.DirectoryInfo 对象)的 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.DirectoryInfo 对象)的 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:对象的一个或多个键属性。键属性标识属性值的实例,如会话历史记录
中的项目的 ID 号等。
例如:以下 XML 定义 Get-Service cmdlet 所返回的服务(System.ServiceProcess.ServiceController
对象)的默认显示。它定义一个名为"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> 标记,用于指定属性集的名称,还必须有一对
<ReferencedProperty> 标记,用于指定属性。属性的名称包含在 <Name> 标记对中。
在 Types.ps1xml 中,<PropertySet> 标记用于为对象的默认显示定义属性集。在 <MemberSet> 标
记的 <Name> 标记中,可以通过值"PsStandardMembers"标识默认显示。
例如,以下 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> 标
记,该标记中包含返回方法结果的脚本块。
例如,管理对象 (System.System.Management.ManagementObject) 的
ConvertToDateTime 和 ConvertFromDateTime 方法是脚本方法,这些方法使用
System.Management.ManagementDateTimeConverter 类的 ToDateTime 和
ToDmtfDateTime 静态方法。
<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 属性是一个脚本属性,它是通过
System.Diagnostics.FileVersionInfo 对象的 GetVersionInfo 静态方法的 FullName
属性获取的。
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>VersionInfo</Name>
<GetScriptBlock>
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
有关详细信息,请参阅 MSDN (Microsoft Developer Network) 库中的 Windows
PowerShell 软件开发工具包 (SDK),网址是 https://go.microsoft.com/fwlink/?LinkId=144538。
Update-TypeData
若要将 Types.ps1xml 文件加载到 Windows PowerShell 控制台,请使用 Update-TypeData cmdlet。
如果希望您文件中的类型优先于内置文件 Types.ps1xml 中的类型,请使用 Update-TypeData 的
PrependData 参数。Update-TypeData 仅影响当前控制台。要使更改应用于以后所有的控制
台,请导出当前控制台,或者将 Update-TypeData 命令添加到 Windows PowerShell 配置文件。
对 Types.ps1xml 文件进行签名
若要对您的 Types.ps1xml 文件的用户提供保护,请使用数字签名对该文件进行签名。有关详细信息,
请参阅 about_Signing。
另请参阅
about_Signing
Copy-Item
Get-Member
Update-TypeData