主题
about_Format.ps1xml
简短说明
Windows PowerShell 中的 Format.ps1xml 文件用于定义 Windows PowerShell
控制台中对象的默认显示。您可以创建自己的 Format.ps1xml 文件,以更改对象的显示或者为在 Windows
PowerShell 中创建的新对象类型定义默认显示。
详细说明
Windows PowerShell 中的 Format.ps1xml 文件用于定义 Windows PowerShell
中对象的默认显示。您可以创建自己的 Format.ps1xml 文件,以更改对象的显示或者为在 Windows
PowerShell 中创建的新对象类型定义默认显示。
当 Windows PowerShell 显示对象时,它将使用结构化格式设置文件中的数据来确定对象的默认显示。格式设
置文件中的数据确定是在表还是在列表中呈现对象,还确定默认情况下显示哪些属性。
格式设置仅影响显示,不影响传入管道的对象属性以及这些属性的传递方式。
Windows PowerShell 提供七个格式设置文件。这些文件位于安装目录 ($pshome) 中。每个文件定义一组
Microsoft .NET Framework 对象的显示:
Certificate.Format.ps1xml
证书存储区中的对象(如 X.509 证书)和证书存储区。
DotNetTypes.Format.ps1xml
其他 .NET Framework 类型,如 CultureInfo、FileVersionInfo 和
EventLogEntry 对象。
FileSystem.Format.ps1xml
文件系统对象,如文件和目录。
Help.Format.ps1xml
帮助视图(如详细和完整视图)、参数和示例。
PowerShellCore.format.ps1xml
由 Windows PowerShell 核心 cmdlet(如 Get-Member 和
Get-History)生成的对象。
PowerShellTrace.format.ps1xml
跟踪对象,如由 Trace-Command cmdlet 生成的对象。
Registry.format.ps1xml
注册表对象,如注册表项和注册表条目。
格式设置文件可以为每个对象定义四种不同的视图:表视图、列表视图、宽视图和复杂视图。例如,
在将 Get-ChildItem 命令的输出通过管道传入 Format-List 命令时,Format-List 将使用
FileSystem.format.ps1xml 文件中的视图确定如何将文件和文件夹对象显示为列表。
在 Format.ps1xml 文件中,视图由一组 XML 标记定义,这些标记描述了该视图的名称、该视图可应用于的对
象类型、列标题以及在该视图主体中显示的属性。Format.ps1xml 文件中的格式在即将向用户呈现数据时应用。
创建新的 Format.ps1xml 文件
与 Windows PowerShell 一起安装的 .ps1xml 文件经过了数字签名以防篡改(因为格式设置中可能包含脚
本块)。因此,若要更改现有对象视图的显示格式或为新对象添加视图,请创建您自己的 Format.ps1xml 文
件,然后将这些文件添加到 Windows PowerShell 会话中。
若要创建新文件,请复制现有的 Format.ps1xml 文件。新文件可以使用任何名称,但其文件扩展名必须
为 .ps1xml。您可以将新文件放在 Windows PowerShell 可访问的任何目录中,但最好将这些文件放在
Windows PowerShell 安装目录 ($pshome) 或该安装目录的子目录中。
若要更改当前视图的格式设置,请在格式设置文件中找到该视图,然后使用标记更改该视图。
若要为新对象类型创建视图,请创建一个新视图,或者将现有视图用作模型。(标记将在本主题的
下一节中进行说明。)然后,可以删除该文件中的所有其他视图,以便检查该文件的任何人都可以明显看到这些更改。
保存这些更改之后,使用 Update-FormatData cmdlet 将新文件添加到 Windows PowerShell 会话
中。如果希望您的视图优先于内置文件中定义的视图,请使用 Update-FormatData 的 PrependData 参
数。Update-FormatData 仅影响当前会话。要使更改应用于以后所有的会话,请在 Windows PowerShell
配置文件中添加 Update-FormatData 命令。
示例:向区域性对象中添加日历数据
此示例说明如何更改由 Get-Culture cmdlet 生成的区域性对象
(System.Globalization.CultureInfo) 的格式设置。
示例中的命令将 Calendar 属性添加到区域性对象的默认表视图中。
第一步是查找包含区域性对象的当前视图的 Format.ps1xml 文件。以下 Select-String 命令用于查找该
文件:
select-string -path $pshome\*format.ps1xml `
-pattern System.Globalization.CultureInfo
此命令显示相应的定义位于 DotNetTypes.Format.ps1xml 文件中。
下一个命令将该文件的内容复制到一个新文件 MyDotNetTypes.Format.ps1xml 中。
copy-item DotNetTypes.Format.ps1xml MyDotNetTypes.Format.ps1xml
然后,使用任何 XML 或文本编辑器(如记事本)打开 MyDotNetTypes.Format.ps1xml 文件。找到
System.Globalization.CultureInfo 对象节。以下 XML 定义 CultureInfo 对象的视图。
该对象只有一个 TableControl 视图。
<View>
<Name>System.Globalization.CultureInfo</Name>
<ViewSelectedBy>
<TypeName>Deserialized.System.Globalization.CultureInfo</TypeName>
<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>
删除该文件的其余部分,但不要删除 <?XML>、<Configuration> 和 <ViewDefinitions> 起始标记以及
<ViewDefintions> 和 <Configuration> 结束标记。此外,每次更改该文件时还必须删除
数字签名。
<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<ViewDefinitions>
<View>
<Name>System.Globalization.CultureInfo</Name>
<ViewSelectedBy>
<TypeName>Deserialized.System.Globalization.CultureInfo</TypeName>
<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 属性创建一个新列。Calendar 属
性的值可能很长,因此将使用包含 45 个字符的值,如下所示:
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Width>16</Width>
</TableColumnHeader>
<TableColumnHeader>
<Width>16</Width>
</TableColumnHeader>
<TableColumnHeader>
<Width>45</Width>
</TableColumnHeader>
<TableColumnHeader/>
</TableHeaders>
现在,在表行中添加一个新列项,如下所示:
<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 命令(如下面的命令)将新格式文件添加到当前会话中。
该命令使用 PrependData 参数以高于原始文件的优先级顺序放入新文件。(有关 Update-FormatData 的
详细信息,请键入"get-help update-formatdata"。)
update-formatdata -prependpath $pshome\MyDotNetTypes.format.ps1xml
若要测试这一更改,请键入"get-culture",然后查看输出(输出中包含 Calendar 属性)。
C:\PS> get-culture
LCID Name Calendar DisplayName
---- ---- -------- -----------
1033 en-US System.Globalization.GregorianCalendar English (United States)
Format.ps1xml 文件中的 XML
每个 Format.ps1xml 文件的 ViewDefinitions 节都包含定义每一种视图的 <View> 标记。典型的
<View> 标记包括以下标记:
<Name>
<Name> 标记用于标识视图的名称。
<ViewSelectedBy>
<ViewSelectedBy> 标记用于指定应用该视图的
对象类型。
<GroupBy>
<GroupBy> 标记用于指定视图中的项
的分组方式。
<TableControl>
<ListControl>
<WideControl>
<ComplexControl>
这些标记包含指定各项的显示方式的标记。
<ViewSelectedBy> 标记可为要应用该视图的每个对象类型包含一个 <TypeName> 标记。或者,它也可包含
一个 <SelectionSetName> 标记,引用在别处使用 <SelectionSet> 标记定义的选择集。
<GroupBy> 标记包含 <PropertyName> 标记,后者指定按哪个对象属性对项进行分组。它还包含 <Label>
标记或 <ComplexControlName> 标记,前者为每个组指定用作标签的字符串,后者引用使用 <Control>
标记在别处定义的复杂控件。<Control> 标记包含一个 <Name> 标记和一个 <ComplexControl> 标记。
<TableControl> 标记通常包含 <TableHeaders> 和 <TableRowEntries> 标记,这两个标记将定义表
头和表行的格式设置。<TableHeaders> 标记通常包含 <TableColumnHeader> 标记,后者又包含
<Label>、<Width> 和 <Alignment> 标记。<TableRowEntries> 标记包含用于表中每一行的
<TableRowEntry> 标记。<TableRowEntry> 标记又包含 <TableColumnItems> 标记,后者包含用于行
中每一列的 <TableColumnItem> 标记。
<TableColumnItem> 标记通常包含 <PropertyName> 标记或 <ScriptBlock> 标记,前者标识要在定义
的位置显示的对象属性,后者包含用于计算将在该位置显示的结果的脚本代码。
注意:脚本块还可以用于需要显示计算结果的其他位置。
<TableColumnItem> 还可以包含 <FormatString> 标记,后者将指定属性或计算结果的显示方式。
<ListControl> 标记通常包含 <ListEntries> 标记。<ListEntries> 标记又包含
<ListItems> 标记。<ListItems> 标记包含 <ListItem> 标记,后者又包含
<PropertyName> 标记。<PropertyName> 标记指定要在列表中的指定位置显示的对象属性。如果通过选择
集定义了视图选择,则 <ListControl> 标记还可以包含 <EntrySelectedBy> 标记,后者包含一个或多个
<TypeName> 标记。这些 <TypeName> 标记指定 <ListControl> 标记要显示的对象类型。
<WideControl> 标记通常包含 <WideEntries> 标记。<WideEntries> 标记又包含一个或多个
<WideEntry> 标记。<WideEntry> 标记通常包含 <PropertyName> 标记,后者用于指定要在视图的指定
位置显示的属性。<PropertyName> 标记可以包含 <FormatString> 标记,后者指定属性的显示方式。
<ComplexControl> 标记包含比其他视图类型更复杂的标记组合。<ComplexControl> 标记通常包含
<ComplexEntries> 标记。<ComplexEntries> 标记包含多个 <ComplexEntry> 标记。
<ComplexEntry> 标记通常包含 <ComplexItem> 标记。此标记又可以包含针对视图中的指定位置
指定内容和格式设置的各种标记,其中包括 <Text>、<Indentation>、<ExpressionBinding>
和 <NewLine> 标记。
Update-FormatData
若要将 Format.ps1xml 文件加载到 Windows PowerShell 会话,请使用 Update-FormatData
cmdlet。如果希望您文件中的视图优先于内置文件 Format.ps1xml 中的视图,请使用 Update-
FormatData 的 PrependData 参数。Update-FormatData 仅影响当前会话。要使更改应用于以后所有的
会话,请在 Windows PowerShell 配置文件中添加 Update-FormatData 命令。
Types.ps1xml 中的默认显示
$pshome 目录下的 Types.ps1xml 文件定义了一些基本对象类型的默认显示。这些节点名为
PsStandardMembers,其子节点使用以下任一标记:
<DefaultDisplayProperty>
<DefaultDisplayPropertySet>
<DefaultKeyPropertySet>
有关详细信息,请键入以下命令:
get-help about_types.ps1xml
跟踪 Format.ps1xml 文件使用情况
若要在加载或应用 Format.ps1xml 文件时检测错误,请使用 Trace-Command cmdlet 并将以下任意格式
组件用作 Name 参数的值:
FormatFileLoading
UpdateFormatData
FormatViewBinding
有关详细信息,请键入以下命令:
get-help trace-command
get-help get-tracesource
对 Format.ps1xml 文件进行签名
若要对您的 Format.ps1xml 文件的用户提供保护,请使用数字签名对该文件进行签名。有关详细信息,请键入:
get-help about_signing
另请参阅
Update-FormatData
Trace-Command
Get-TraceSource