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