使用 Format 命令更改输出视图

PowerShell 具有一组 cmdlet,可让你控制特定对象的属性的显示方式。 所有 cmdlet 的名称都以谓词 Format 开头。 它们使你可以选择要显示的属性。

Get-Command -Verb Format -Module Microsoft.PowerShell.Utility
CommandType     Name               Version    Source
-----------     ----               -------    ------
Cmdlet          Format-Custom      6.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Format-Hex         6.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Format-List        6.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Format-Table       6.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Format-Wide        6.1.0.0    Microsoft.PowerShell.Utility

本文介绍 Format-WideFormat-ListFormat-Table cmdlet。

PowerShell 中的每个对象类型都具有在未选择要显示的属性时使用的默认属性。 各个 cmdlet 使用相同的 Property 参数,来指定要显示的属性。 因为 Format-Wide 只显示单个属性,其 Property 参数仅采用单个值,但 Format-ListFormat-Table 的属性参数接受一系列属性名称

在此示例中,Get-Process cmdlet 的默认输出显示,我们有两个正在运行的 Internet Explorer 实例。

Get-Process -Name iexplore

Process 对象的默认格式显示如下属性

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     32    25.52      10.25      13.11   12808   1 iexplore
     52    11.46      26.46       3.55   21748   1 iexplore

将 Format-Wide 用于单项输出

默认情况下,Format-Wide cmdlet 只显示对象的默认属性。 与每个对象关联的信息将显示在单个列中:

Get-Command -Verb Format | Format-Wide
Format-Custom          Format-Hex
Format-List            Format-Table
Format-Wide

你还可以指定非默认属性:

Get-Command -Verb Format | Format-Wide -Property Noun
Custom                 Hex
List                   Table
Wide

使用列控制 Format-Wide 显示

使用 Format-Wide cmdlet 时,每次只能显示一个属性。 这可用于在多个列中显示大型列表。

Get-Command -Verb Format | Format-Wide -Property Noun -Column 3
Custom                 Hex                  List
Table                  Wide

将 Format-List 用于列表视图

Format-List cmdlet 以列表的形式显示对象,同时标记每个属性并在单独的行上显示:

Get-Process -Name iexplore | Format-List
Id      : 12808
Handles : 578
CPU     : 13.140625
SI      : 1
Name    : iexplore

Id      : 21748
Handles : 641
CPU     : 3.59375
SI      : 1
Name    : iexplore

你可以指定所需数目的属性:

Get-Process -Name iexplore | Format-List -Property ProcessName,FileVersion,StartTime,Id
ProcessName : iexplore
FileVersion : 11.00.18362.1 (WinBuild.160101.0800)
StartTime   : 10/22/2019 11:23:58 AM
Id          : 12808

ProcessName : iexplore
FileVersion : 11.00.18362.1 (WinBuild.160101.0800)
StartTime   : 10/22/2019 11:23:57 AM
Id          : 21748

通过将 Format-List 与通配符搭配使用获取详细信息

Format-List cmdlet 使你可以将通配符用作其 Property 参数的值。 这样便可以显示详细信息。 通常情况下,对象包含的信息比你需要的多,这就是默认情况下 PowerShell 不显示所有属性值的原因。 若要显示对象的全部属性,请使用 Format-List -Property * 命令。 下面的命令针对单个进程生成 60 多行输出:

Get-Process -Name iexplore | Format-List -Property *

虽然 Format-List 命令对显示详细信息很有用,但如果你想要包括多个项目的输出的概述,更常用的是一个更简单的表格视图。

将 Format-Table 用于表格输出

如果你在没有指定属性名称的情况下使用 Format-Table cmdlet 来格式化 Get-Process 命令的输出,你所得到的输出会和未使用 Format cmdlet 执行任何格式设置时得到的完全一样。 默认情况下,PowerShell 以表格格式显示 Process 对象

Get-Service -Name win* | Format-Table
Status   Name               DisplayName
------   ----               -----------
Running  WinDefend          Windows Defender Antivirus Service
Running  WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running  Winmgmt            Windows Management Instrumentation
Running  WinRM              Windows Remote Management (WS-Manag...

注意

Get-Service 仅在 Windows 平台上可用。

改进 Format-Table 输出

尽管表格视图对显示大量信息很有用,但如果显示区域对于数据来说太窄,则可能导致数据难以理解。 在上面的示例中,输出被截断。 当你运行 Format-Table 命令时,如果你指定 AutoSize 参数,PowerShell 会根据显示的实际数据来计算列宽。 这使得列可读。

Get-Service -Name win* | Format-Table -AutoSize
Status  Name                DisplayName
------  ----                -----------
Running WinDefend           Windows Defender Antivirus Service
Running WinHttpAutoProxySvc WinHTTP Web Proxy Auto-Discovery Service
Running Winmgmt             Windows Management Instrumentation
Running WinRM               Windows Remote Management (WS-Management)

Format-Table cmdlet 仍可能会截断数据,但仅会在屏幕的末尾处进行截断。 除最后一个显示的属性外,会让所有属性获得各自所需的大小,以使最长的数据元素得以正确显示。

Get-Service -Name win* |
    Format-Table -Property Name, Status, StartType, DisplayName, DependentServices -AutoSize
Name                 Status StartType DisplayName                               DependentServi
                                                                                ces
----                 ------ --------- -----------                               --------------
WinDefend           Running Automatic Windows Defender Antivirus Service        {}
WinHttpAutoProxySvc Running    Manual WinHTTP Web Proxy Auto-Discovery Service  {NcaSvc, iphl…
Winmgmt             Running Automatic Windows Management Instrumentation        {vmms, TPHKLO…
WinRM               Running Automatic Windows Remote Management (WS-Management) {}

Format-Table 命令假设按重要性顺序列出属性。 cmdlet 会尝试完整显示离列表开头最近的那些属性。 如果 Format-Table 命令无法显示所有属性,则会从显示中删除某些列。 可以在 DependentServices 属性前一个示例中查看此行为

让列中的 Format-Table 输出自动换行

可以使用 Wrap 参数让较长的 Format-Table 数据在其显示列中自动换行。 使用 Wrap 参数可能不会实现所需的操作,因为如果你不同时指定 AutoSize,它会使用默认设置

Get-Service -Name win* |
    Format-Table -Property Name, Status, StartType, DisplayName, DependentServices -Wrap
Name                 Status StartType DisplayName                               DependentServi
                                                                                ces
----                 ------ --------- -----------                               --------------
WinDefend           Running Automatic Windows Defender Antivirus Service        {}
WinHttpAutoProxySvc Running    Manual WinHTTP Web Proxy Auto-Discovery Service  {NcaSvc,
                                                                                iphlpsvc}
Winmgmt             Running Automatic Windows Management Instrumentation        {vmms,
                                                                                TPHKLOAD,
                                                                                SUService,
                                                                                smstsmgr…}
WinRM               Running Automatic Windows Remote Management (WS-Management) {}

使用 Wrap 参数基本不会减慢进程速度。 但是,使用 AutoSize 格式化大型目录结构的递归文件列表可能得耗用大量时间和内存,才能显示第一批输出项

如果你并不关心系统负载,那么结合使用 AutoSize 和 Wrap 参数则会获得良好的效果。 初始列仍根据需要最大限度地使用宽度来在一行上显示项,但在必要时将最后一列换行。

备注

当你首先指定最宽的列时,可能不会显示某些列。 为了获得最佳结果,请先指定最小的数据元素。

在下面的示例中,我们首先指定最宽的属性。

Get-Process -Name iexplore |
    Format-Table -Wrap -AutoSize -Property FileVersion, Path, Name, Id

即使进行了换行,也会省略最后 ID 列

FileVersion                          Path                                                  Nam
                                                                                           e
-----------                          ----                                                  ---
11.00.18362.1 (WinBuild.160101.0800) C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE iex
                                                                                           plo
                                                                                           re
11.00.18362.1 (WinBuild.160101.0800) C:\Program Files\Internet Explorer\iexplore.exe       iex
                                                                                           plo
                                                                                           re

组织表输出

用于表格输出控制的另一个有用参数是 GroupBy。 较长的列表可能尤其难以进行比较。 GroupBy 参数基于属性值对输出进行分组 例如,我们可以按 StartType 对服务分组以便于检查,同时从属性列表中省略 StartType 值

Get-Service -Name win* | Sort-Object StartType | Format-Table -GroupBy StartType
   StartType: Automatic
Status   Name               DisplayName
------   ----               -----------
Running  WinDefend          Windows Defender Antivirus Service
Running  Winmgmt            Windows Management Instrumentation
Running  WinRM              Windows Remote Management (WS-Managem…

   StartType: Manual
Status   Name               DisplayName
------   ----               -----------
Running  WinHttpAutoProxyS… WinHTTP Web Proxy Auto-Discovery Serv…