Windows PowerShell 提供了一组 cmdlet,使用这些 cmdlet 您可以控制要为特定对象显示的属性。这些 cmdlet 的名称均以动词 Format 开头。它们允许您选择一个或多个要显示的属性。

Format cmdlet 包括 Format-WideFormat-ListFormat-TableFormat-Custom。本用户指南中将仅介绍 Format-WideFormat-ListFormat-Table cmdlet。

每个格式 cmdlet 都具有默认属性;如果未指定要显示的特定属性,则会使用这些默认属性。每个 cmdlet 都使用同一参数名称 Property 来指定要显示的属性。由于 Format-Wide 仅显示单个属性,因此其 Property 参数仅获取单个值,但 Format-ListFormat-Table 的属性参数将接受一系列属性名称。

如果对两个正在运行的 Windows PowerShell 实例使用 Get-Process -Name powershell 命令,所得到的输出将类似于以下内容:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    995       9    30308      27996   152     2.73   2760 powershell
    331       9    23284      29084   143     1.06   3448 powershell

本节的其余部分将探讨如何使用 Format cmdlet 来更改此命令的输出显示方式。

使用 Format-Wide 显示单项输出

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

PS> Get-Process -Name powershell | Format-Wide

powershell                              powershell

也可以指定非默认属性:

PS> Get-Process -Name powershell | Format-Wide -Property Id

2760                                    3448

使用 Column 控制 Format-Wide 显示

使用 Format-Wide cmdlet,每次只能显示一个属性。这样对于显示每行仅显示一个元素的简单列表十分有用。若要获取简单列表,请键入以下命令来将 Column 参数的值设置为 1:

Get-Command Format-Wide -Property Name -Column 1

使用 Format-List 显示列表视图

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

PS> Get-Process -Name powershell | Format-List

Id      : 2760
Handles : 1242
CPU     : 3.03125
Name    : powershell

Id      : 3448
Handles : 328
CPU     : 1.0625
Name    : powershell

可以根据需要指定任意数量的属性:

PS> Get-Process -Name powershell | Format-List -Property ProcessName,FileVersion
,StartTime,Id


ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:42:00
Id          : 2760

ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:54:28
Id          : 3448

使用 Format-List 和通配符来获取详细信息

Format-List cmdlet 允许您将通配符用作其 Property 参数的值。这样可以显示详细信息。通常,对象所包含的信息多于您需要的信息,因此,默认情况下 Windows PowerShell 将不会显示所有属性值。若要显示对象的所有属性,请使用 Format-List -Property * 命令。以下命令将为单个进程生成超过 60 行输出:

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

虽然 Format-List 命令对于显示详细信息十分有用,但如果希望获得包含多个项的输出概览,则较简单的表格格式视图通常会更有用。

使用 Format-Table 显示表格格式输出

如果使用 Format-Table cmdlet(未指定任何属性名称)来设置 Get-Process 命令的输出格式,所获得的输出将与不执行任何格式设置的情况完全相同。这是因为与大多数 Windows PowerShell 对象一样,进程通常是以表格格式显示的。

PS> Get-Process -Name powershell | Format-Table

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   1488       9    31568      29460   152     3.53   2760 powershell
    332       9    23140        632   141     1.06   3448 powershell

改进 Format-Table 输出 (AutoSize)

尽管表格格式的视图适用于显示大量可比较信息,但其可能难以判断显示区域是否过窄而无法容纳数据。例如,如果试图显示进程路径、ID、名称和公司,则会导致进程路径和公司列的输出被截断:

PS> Get-Process -Name powershell | Format-Table -Property Path,Name,Id,Company

Path                Name                                 Id Company
----                ----                                 -- -------
C:\Program Files... powershell                         2836 Microsoft Corpor...

如果在运行 Format-Table 命令时指定了 AutoSize 参数,则 Windows PowerShell 将基于要显示的实际数据来计算列宽。这样会使 Path 列可读,但 Company 列仍处于截断状态:

PS> Get-Process -Name powershell | Format-Table -Property Path,Name,Id,Company -
AutoSize

Path                                                    Name         Id Company
----                                                    ----         -- -------
C:\Program Files\Windows PowerShell\v1.0\powershell.exe powershell 2836 Micr...

Format-Table cmdlet 仍然可能会截断数据,但截断只会发生在屏幕的末尾部分。除最后一个显示的属性外,会将其他属性指定为其最长数据元素所需的宽度以进行正常显示。如果在 Property 值列表中将 PathCompany 交换位置,您将发现公司名称是可见的,但路径被截断:

PS> Get-Process -Name powershell | Format-Table -Property Company,Name,Id,Path -
AutoSize

Company               Name         Id Path
-------               ----         -- ----
Microsoft Corporation powershell 2836 C:\Program Files\Windows PowerShell\v1...

Format-Table 命令假定离属性列表开头越近的属性的重要性越高。因此,它会试图完全显示最靠近开头的属性。如果 Format-Table 命令无法显示所有属性,则会从显示中删除部分列并发出相应警告。如果将 Name 作为列表中的最后一个属性,则会看到此行为:

PS> Get-Process -Name powershell | Format-Table -Property Company,Path,Id,Name -
AutoSize

WARNING: column "Name" does not fit into the display and was removed.

Company               Path                                                    I
                                                                              d
-------               ----                                                    -
Microsoft Corporation C:\Program Files\Windows PowerShell\v1.0\powershell.exe 6

在以上输出中,ID 列被截断以便能容纳在列表中,并且堆叠了列标题。自动调整各列大小,并不一定总会实现您需要的效果。

让 Format-Table 输出在列中换行 (Wrap)

通过使用 Wrap 参数,可以强行使冗长的 Format-Table 数据在其显示列中换行。单独使用 Wrap 参数不一定能实现您的预期效果,这是因为如果不同时指定 AutoSize 则会使用默认设置:

PS> Get-Process -Name powershell | Format-Table -Wrap -Property Name,Id,Company,
Path

Name                                 Id Company             Path
----                                 -- -------             ----
powershell                         2836 Microsoft Corporati C:\Program Files\Wi
                                        on                  ndows PowerShell\v1
                                                            .0\powershell.exe 

单独使用 Wrap 参数的一个优点在于它不会极大地降低处理速度。如果在执行大型目录系统的递归文件列表时使用 AutoSize,则在显示第一个输出项之前可能需要花费很长时间并占用大量内存。

如果不考虑系统负载,则将 AutoSizeWrap 参数一起使用会取得不错的效果。与指定 AutoSize 而不指定 Wrap 参数时的情况一样,始终会为初始列分配它们在一行内显示项所需的宽度。唯一的不同之处在于:如有必要,最后一列将进行换行:

PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Name,I
d,Company,Path

Name         Id Company               Path
----         -- -------               ----
powershell 2836 Microsoft Corporation C:\Program Files\Windows PowerShell\v1.0\
                                      powershell.exe

如果先指定最宽的列,则可能无法显示某些列,因此,最安全的做法是先指定最小的数据元素。在下面的示例中,我们先指定最宽的路径元素,在这种情况下,即使通过换行也仍然无法显示最后的 Name 列:

 PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Path,I
d,Company,Name

WARNING: column "Name" does not fit into the display and was removed.

Path                                                      Id Company
----                                                      -- -------
C:\Program Files\Windows PowerShell\v1.0\powershell.exe 2836 Microsoft Corporat
                                                             ion

组织表输出 (-GroupBy)

用于表格格式输出控制的另一个有用参数是 GroupBy。越长的表格格式列表可能越难以进行比较。GroupBy 参数可以基于属性值对输出进行分组。例如,我们可以按公司对进程进行分组,从而忽略属性列表中的公司值来更轻松地进行检查:

PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Name,I
d,Path -GroupBy Company


   Company: Microsoft Corporation

Name         Id Path
----         -- ----
powershell 1956 C:\Program Files\Windows PowerShell\v1.0\powershell.exe
powershell 2656 C:\Program Files\Windows PowerShell\v1.0\powershell.exe




目录