主题 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