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




目录