共用方式為


about_Types.ps1xml

主題
    about_Types.ps1xml

簡短描述
    說明 Types.ps1xml 檔案如何讓您擴充 Windows PowerShell 中使用的物件的 Microsoft .NET 
    Framework 型別。

完整描述
    Windows PowerShell 安裝目錄 ($pshome) 中的 Types.ps1xml 檔案是一種 XML 文字檔案,
    可讓您將屬性與方法新增至 Windows PowerShell 中使用的物件。Windows PowerShell 的內
    建 Types.ps1xml 檔案會將數個元素新增至 .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)


    這個命令會傳回下列結果。

    名稱           MemberType    定義
    ----           ----------    ----------
    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。


  範例:將 Age 成員新增至 FileInfo 物件

      在這個範例中,會示範如何將 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()</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>


      在儲存檔案並加以關閉後,使用 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> 標記表示。

      Type 標記必須包含下列標記:

          <Name>:一對括住受影響的 .NET Framework 型別 
                  之名稱的 <Name> 標記。

          <Members>:一對括住為 .NET Framework 型別定義 
                     的新屬性與方法之標記的 <Members> 標記。

      任何下列成員標記都可以在 <Members> 標記之內。

      <AliasProperty>:定義現有屬性的新名稱。

         <AliasProperty> 標記必須有一組 <Name> 標記 (用於指定新屬性的名稱) 與一
         組 <ReferencedMemberName> 標記 (用於指定現有的屬性)。
         例如,Count 別名屬性是陣列物件的 Length 屬性的別名。

             <Type>
                 <Name>System.Array</Name>
                 <Members>
                     <AliasProperty>
                         <Name>Count</Name>
                         <ReferencedMemberName>Length</ReferencedMemberName>
                     </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:物件的一個或多個索引鍵屬性。索引鍵屬性可識別屬性
              值的執行個體,例如工作階段歷程記錄中的項目識別碼。

         例如,下列 XML 會定義 Get-Service Cmdlet 所傳回之服務 
         (System.ServiceProcess.ServiceController 物件) 的預設顯示。這個 XML 會定義一個名
         稱為 "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) Library 中的
      <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