Windows PowerShell 为您提供了多个用于直接控制数据输出的 cmdlet。这些 cmdlet 具有两个重要的共同特征。

第一,它们通常都将数据转换为某种文本形式。这是因为它们要将数据输出到需要接受文本输入的系统组件。这意味着它们需要以文本形式表示对象。因此,文本格式将与 Windows PowerShell 控制台窗口中所显示的格式相同。

第二,这些 cmdlet 都使用 Windows PowerShell 动词 Out,这是因为它们要将信息从 Windows PowerShell 中发送到其他位置。Out-Host cmdlet 也不例外:主机窗口显示位于 Windows PowerShell 之外。这一特征十分重要,因为从 Windows PowerShell 发出数据时,实际上将删除该数据。如果试图创建将数据分页发送到主机窗口的管道,然后尝试将其格式设置为列表,则会看到此类情况,如下所示:

PS> Get-Process | Out-Host -Paging | Format-List

您可能希望该命令以列表格式来显示进程信息页面。实际上,它将显示默认的表格格式列表:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    101       5     1076       3316    32     0.05   2888 alg
...
    618      18    39348      51108   143   211.20    740 explorer
    257       8     9752      16828    79     3.02   2560 explorer
...
<SPACE> next page; <CR> next line; Q quit
...

Out-Host cmdlet 将数据直接发送到控制台,因此 Format-List 命令决不会收到任何要进行格式设置的内容。

若要构建此命令的结构,正确方式是将 Out-Host cmdlet 放在管道末尾,如下所示。这样将导致先在列表中设置进程数据的格式,然后再进行分页和显示。

PS> Get-Process | Format-List | Out-Host -Paging


Id      : 2888
Handles : 101
CPU     : 0.046875
Name    : alg
...

Id      : 740
Handles : 612
CPU     : 211.703125
Name    : explorer

Id      : 2560
Handles : 257
CPU     : 3.015625
Name    : explorer
...
<SPACE> next page; <CR> next line; Q quit
...

此方式适用于所有的 Out cmdlet。Out cmdlet 应始终出现在管道末尾。

注意:

所有的 Out cmdlet 都以文本形式呈现输出,并使用控制台窗口的有效格式设置(包含行长度限制)进行显示。

对控制台输出进行分页 (Out-Host)

默认情况下,Windows PowerShell 会将数据发送到主机窗口,这与 Out-Host cmdlet 的作用完全相同。正如前面所讨论的,Out-Host cmdlet 的主要用途是对数据进行分页。例如,以下命令使用 Out-Host 对 Get-Command cmdlet 的输出进行分页:

PS> Get-Command | Out-Host -Paging

也可以使用 more 函数来对数据进行分页。在 Windows PowerShell 中,more 是一个调用 Out-Host -Paging 的函数。以下命令演示了如何使用 more 函数对 Get-Command 的输出进行分页:

PS> Get-Command | more

如果将一个或多个文件名用作 more 函数的参数,则该函数将读取指定的文件并将其内容分页发送到主机:

PS> more c:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
...

放弃输出 (Out-Null)

Out-Null cmdlet 的作用是立即放弃其收到的任何输入。如果希望放弃作为运行命令的副产品而获得的不需要的数据,则此命令十分有用。键入以下命令后,将不会返回任何输出:

PS> Get-Command | Out-Null

Out-Null cmdlet 不会放弃错误输出。例如,如果输入以下命令,将显示一条消息,通知您 Windows PowerShell 无法识别“Is-NotACommand”:

PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operabl
e program, or script file.
At line:1 char:12
+ Get-Command  <<<< Is-NotACommand | Out-Null

打印数据 (Out-Printer)

可以使用 Out-Printer cmdlet 打印数据。如果未提供打印机名称,则 Out-Printer cmdlet 将使用默认打印机。通过指定打印机的显示名称,您可以使用任何基于 Windows 的打印机。无需指定任何种类的打印机端口映射,甚至无需指定真实的物理打印机。例如,如果安装了 Microsoft Office 文档图像工具,可以通过键入以下命令将数据发送到图像文件:

PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"

保存数据 (Out-File)

可以使用 Out-File cmdlet 将输出发送到文件而不是控制台窗口。以下命令行会将一个进程列表发送到文件 C:\temp\processlist.txt

PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt 

如果习惯于传统的输出重定向,则使用 Out-File cmdlet 的结果可能与您的预期结果不同。若要了解此命令的行为,必须了解运行 Out-File cmdlet 的上下文。

默认情况下,Out-File cmdlet 将创建 Unicode 文件。从长远的角度来看,这是最佳的默认值,但这意味着预期使用 ASCII 文件的工具将无法正确处理该默认输出格式。可以使用 Encoding 参数将默认输出格式更改为 ASCII:

PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII

Out-file 将文件内容的格式设置为类似于控制台输出的格式。这样将导致在大多数情况下输出将像在控制台窗口中一样发生截断。例如,如果运行以下命令:

PS> Get-Command | Out-File -FilePath c:\temp\output.txt

输出将与以下所示类似:

CommandType     Name                            Definition                     
-----------     ----                            ----------                     
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
...

若要获得不强行进行换行以匹配屏幕宽度的输出,可以使用 Width 参数来指定行宽。由于 Width 是 32 位整数参数,因此其最大值为 2147483647。键入以下命令可以将行宽设置为此最大值:

Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647

如果希望按照控制台上所显示的格式保存输出,则 Out-File cmdlet 最有用。若要更好地控制输出格式,您需要使用更高级的工具。我们将在下一章介绍这些工具,并提供有关对象操作的一些详细信息。




目录