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