簡短描述
從 PowerShell 6 開始,對象的預設檢視定義於 PowerShell 原始程式碼中。
您可以建立自己的 Format.ps1xml 檔案來變更對象的顯示,或為您在 PowerShell 中建立的新物件類型定義預設顯示。
完整描述
從 PowerShell 6 開始,預設檢視會在 PowerShell 原始碼中定義。 PowerShell 5.1 和舊版 Format.ps1xml 檔案不存在於 PowerShell 6 和更新版本中。
PowerShell 原始程式碼會定義 PowerShell 控制台中對象的預設顯示。 您可以建立自己的 Format.ps1xml 檔案來變更對象的顯示,或為您在 PowerShell 中建立的新物件類型定義預設顯示。
當 PowerShell 顯示物件時,它會使用結構化格式檔案中的數據來判斷對象的預設顯示。 格式化檔案中的數據會決定物件是在數據表或清單中轉譯,並決定預設會顯示哪些屬性。
格式只會影響顯示。 這不會影響哪些物件屬性會傳遞至管線或傳遞方式。
Format.ps1xml 檔案無法用來自訂雜湊表的輸出格式。
.ps1xml 格式檔案可以定義每個物件的四個不同的檢視:
- 桌子
- 清單
- 寬
- 習慣
例如,當 Get-ChildItem 命令的輸出管線傳送至 Format-List 命令時,Format-List 會使用原始碼中定義的清單檢視來判斷如何將檔案和資料夾物件顯示為清單。
當格式化檔案包含一個以上的物件檢視時,PowerShell 會套用它找到的第一個檢視。
在自定義 Format.ps1xml 檔案中,檢視是由一組 XML 標籤所定義,這些標記描述檢視的名稱、可以套用的物件類型、數據行標頭,以及顯示在檢視主體中的屬性。
Format.ps1xml 檔案中的格式會在數據呈現給使用者之前套用。
建立新的 Format.ps1xml 檔案
若要變更現有物件檢視的顯示格式,或新增新對象的檢視,請建立自己的 Format.ps1xml 檔案,然後將它們新增至 PowerShell 會話。
若要建立 Format.ps1xml 檔案來定義自定義檢視,請使用 Get-FormatData 和 Export-FormatData Cmdlet。 使用文字編輯器來編輯檔案。 檔案可以儲存至 PowerShell 可以存取的任何目錄,例如 $HOME的子目錄。
若要變更目前檢視的格式設定,請在格式化檔案中找出檢視,然後使用標記來變更檢視。 若要建立新物件類型的檢視,請建立新的檢視,或使用現有的檢視作為模型。 下一節會說明標記。 然後,您可以刪除檔案中所有其他檢視,使得檢查檔案的人可以明顯看出變更。
儲存變更之後,請使用 Update-FormatData,將新檔案新增至 PowerShell 會話。 如果您希望檢視的優先權高於內建檔案中定義的檢視,請使用 PrependPath 參數。
Update-FormatData 只會影響目前的會話。 若要變更所有未來的會話,請將 Update-FormatData 命令新增至PowerShell配置檔。
範例:將日曆數據新增至文化物件
此範例示範如何變更目前 PowerShell 會話中 Cmdlet 所產生之 System.Globalization.CultureInfo Get-Culture fo 的文化特性物件格式。 範例中的命令會將 Calendar 屬性新增至文化特性對象的預設數據表檢視顯示。
若要開始,請從原始程式碼檔案取得格式資料,並建立包含文化對象目前檢視的 Format.ps1xml 檔案。
New-Item -Path $HOME\Format -ItemType Directory -Force
Get-FormatData -TypeName System.Globalization.CultureInfo |
Export-FormatData -LiteralPath $HOME\Format\CultureInfo.Format.ps1xml
在任何 XML 或文本編輯器中開啟 CultureInfo.Format.ps1xml 檔案,例如 Visual Studio Code。 下列 XML 會定義 CultureInfo 物件的檢視。
CultureInfo.Format.ps1xml 檔案看起來應該像下列範例:
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<ViewDefinitions>
<View>
<Name>System.Globalization.CultureInfo</Name>
<ViewSelectedBy>
<TypeName>System.Globalization.CultureInfo</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Width>16</Width>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
</TableColumnHeader>
<TableColumnHeader />
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>LCID</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>DisplayName</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
藉由新增一組新的 標籤,為 <TableColumnHeader> 屬性建立新的數據行。
Calendar 屬性的值可能很長,因此請將其限制為 45 個字元,並指定為 <Width>。
<TableHeaders>
<TableColumnHeader>
<Width>16</Width>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
</TableColumnHeader>
<TableColumnHeader>
<Width>45</Width>
</TableColumnHeader>
<TableColumnHeader/>
</TableHeaders>
使用 和 <TableColumnItem> 標籤,在資料表的列中為 <PropertyName 新增一個欄位項目:
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>LCID</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Calendar</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>DisplayName</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
儲存並關閉檔案。 使用 Update-FormatData 將新的格式檔案新增至目前的 PowerShell 會話。
此範例會使用 prependPath 參數
Update-FormatData -PrependPath $HOME\Format\CultureInfo.Format.ps1xml
若要測試變更,請輸入 Get-Culture,並檢閱包含 Calendar 屬性的輸出。
Get-Culture
LCID Name Calendar DisplayName
---- ---- -------- -----------
1033 en-US System.Globalization.GregorianCalendar English (United States)
Format.ps1xml 檔案中的 XML
您可以在 GitHub 上 PowerShell 原始程式碼存放庫中的 Format.xsd 中找到完整的架構定義。
每個 檔案 Format.ps1xml 區段包含定義每個檢視的 <View> 標記。 典型的 <View> 標籤包含下列標籤:
-
<Name>標識檢視名稱。 -
<ViewSelectedBy>指定此檢視適用的物件類型。 -
<GroupBy>會指定如何在群組中合併檢視中的專案。 -
<TableControl>、<ListControl>、<WideControl>和<CustomControl>包含標記,指定每個項目的顯示方式。
依據選取方式查看 標籤
<ViewSelectedBy> 標記可以包含 <TypeName> 標記,適用於每一個檢視所應用的物件類型。 或者,它可以包含 <SelectionSetName> 標記,參考在其他地方使用 <SelectionSet> 標記定義的選取集。
GroupBy 標記
<GroupBy> 標籤包含 <PropertyName> 標記,指定要分組項目的物件屬性。 它還包含一個 <Label> 標籤,指定用作每個群組標籤的字串,或包含一個 <CustomControlName> 標籤,該標籤通過使用其它地方定義的 <Control> 標籤來參考自定義控件。
<Control> 標籤包含 <Name> 標籤和 <CustomControl> 標籤。
TableControlTag
<TableControl> 標籤標通常包含 <TableHeaders> 和 <TableRowEntries> 標記,這些標記會定義數據表的頁首和數據列的格式。
<TableHeaders> 標籤通常包含 <TableColumnHeader> 標籤,其中包含 <Label>、<Width>和 <Alignment> 標籤。
<TableRowEntries> 標記包含數據表中每個數據列的 <TableRowEntry> 標記。
<TableRowEntry> 標籤包含 <TableColumnItems> 標籤,其中每一行的每一列都有 <TableColumnItem> 標籤。 一般而言,<TableColumnItem> 標記包含可識別要顯示在定義位置之物件屬性的 <PropertyName> 標記,或包含腳本程式代碼的 <ScriptBlock> 標記,其會計算要顯示在位置的結果。
注意
腳本區塊也可用於其他需要計算結果的地點。
<TableColumnItem> 標籤也可以包含 <FormatString> 標記,指定屬性或計算結果的顯示方式。
ListControl 標籤
<ListControl> 標籤通常包含 <ListEntries> 標籤。
<ListEntries> 標籤包含 <ListEntry> 標籤。
<ListEntry> 標籤包含 <ListItems> 標籤。
<ListItems> 標籤包含 <ListItem> 標籤,其中包含 <PropertyName> 標籤。
<PropertyName> 標記會指定要顯示在清單中指定位置的物件屬性。 如果使用選取集定義檢視選取範圍,則 <ListControl> 和 <ListEntry> 標籤也可以包含包含一或多個 <EntrySelectedBy> 標籤的 <TypeName> 標籤。 這些 <TypeName> 標記會指定 <ListControl> 標記要顯示的物件類型。
WideControl 標籤
<WideControl> 標籤通常包含 <WideEntries> 標籤。
<WideEntries> 標籤包含一或多個 <WideEntry> 標籤。
<WideEntry> 標籤包含一個 <WideItem> 標籤。
<WideItem> 標籤必須包含 <PropertyName> 標籤或 <ScriptBlock> 標籤。
<PropertyName> 標記會指定要顯示在檢視中指定位置的屬性。
<ScriptBlock> 標記會指定要在檢視中指定位置評估及顯示的腳本。
<WideItem> 標籤可以包含 <FormatString> 標記,指定如何顯示屬性。
CustomControl 標籤
這個 <CustomControl> 標籤讓你可以用腳本區塊來定義格式。
<CustomControl> 標籤通常包含一個包含多個 <CustomEntries> 標籤的 <CustomEntry> 標籤。 每個 <CustomEntry> 標籤都包含一個 <CustomItem> 標記,其中包含各種標記,這些標籤可指定檢視中指定位置的內容和格式,包括 <Text>、<Indentation>、<ExpressionBinding>和 <NewLine> 標記。
追蹤 Format.ps1xml 檔案使用
若要偵測載入或套用 Format.ps1xml 檔案時發生的錯誤,請使用 Trace-Command cmdlet 並將下列任何格式元件作為 Name 參數的值:
- 格式檔載入
- FormatViewBinding
如需詳細資訊,請參閱 Trace-Command 和 Get-TraceSource。
簽署 Format.ps1xml 檔案
若要保護 Format.ps1xml 檔案的使用者,請使用數位簽名簽署檔案。 如需詳細資訊,請參閱 about_Signing。
Format-Table 自訂檢視的範例 XML
下列 XML 範例會為 Format-Table所建立 System.IO.DirectoryInfo 和 System.IO.FileInfo 物件建立 Get-ChildItem 自定義檢視。 自定義檢視名為 myGciView ,並將 CreationTime 數據行新增至數據表。
若要建立自定義檢視,請使用 Get-FormatData 和 Export-FormatData Cmdlet 來產生 .ps1xml 檔案。 然後,編輯您的 .ps1xml 檔案,以建立自定義檢視的程序代碼。
.ps1xml 檔案可以儲存在任何 PowerShell 可以存取的目錄中。 例如,$HOME的子目錄。
建立 .ps1xml 檔案之後,請使用 Update-FormatData Cmdlet,在目前的 PowerShell 會話中包含檢視。 或者,如果您需要所有 PowerShell 工作階段中可用的檢視,請將更新命令新增至 PowerShell 配置檔。
在此範例中,自定義檢視必須使用數據表格式,否則 Format-Table 會失敗。
使用 Format-Table 搭配 View 參數來指定自定義檢視的名稱、MyGciView,並使用 CreationTime 數據行格式化數據表的輸出。 如需如何執行命令的範例,請參閱 Format-Table。
注意
雖然您可以從原始程式碼取得格式化 XML 以建立自訂檢視,但可能需要更多開發才能取得所需的結果。
在以下的 Get-FormatData 命令中,PowerShellVersion 參數有一個替代選項,可確保傳回所有本機格式資訊。 使用 -PowerShellVersion $PSVersionTable.PSVersion,而不是特定的 PowerShell 版本。
Get-FormatData -PowerShellVersion 5.1 -TypeName System.IO.DirectoryInfo |
Export-FormatData -LiteralPath $HOME\Format\MyGciView.Format.ps1xml
Update-FormatData -AppendPath $HOME\Format\MyGciView.Format.ps1xml
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<ViewDefinitions>
<View>
<Name>MyGciView</Name>
<ViewSelectedBy>
<TypeName>System.IO.DirectoryInfo</TypeName>
<TypeName>System.IO.FileInfo</TypeName>
</ViewSelectedBy>
<GroupBy>
<PropertyName>PSParentPath</PropertyName>
</GroupBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>Mode</Label>
<Width>7</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>LastWriteTime</Label>
<Width>26</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>CreationTime</Label>
<Width>26</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Length</Label>
<Width>14</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Name</Label>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<Wrap />
<TableColumnItems>
<TableColumnItem>
<PropertyName>ModeWithoutHardLink</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>LastWriteTime</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>CreationTime</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Length</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>