重定向输出

PowerShell 提供了几个 cmdlet,可让你直接控制数据输出。 这些 cmdlet 具有两个重要的共同特征。

第一,它们通常将数据转换为某种形式的文本。 这样做的原因是它们将数据输出到需要文本输入的系统组件。 这意味着它们需要将对象表示为文本。 因此,文本的格式设置为你在 PowerShell 控制台窗口中看到的形式。

第二,这些 cmdlet 使用 PowerShell 谓词 Out,因为它们会将信息从 PowerShell 发送到别处。

控制台输出

默认情况下,PowerShell 将数据发送到主机窗口,这正是 Out-Host cmdlet 的作用。 Out-Host cmdlet 的主要用途是分页。 例如,下面的命令使用 Out-HostGet-Command cmdlet 的输出进行分页:

Get-Command | Out-Host -Paging

主机窗口显示在 PowerShell 之外。 这一点尤为重要,原因是将数据发送出 PowerShell 时,实际上已删除该数据。 在你尝试创建用于将数据分页到主机窗口的管道,然后尝试将其格式化为列表时,可以看到此内容,如下所示:

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 置于管道末尾,如下所示。 这将导致进程数据先在列表中格式化,然后再分页和显示。

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-Null cmdlet 旨在用于立即放弃接收的任何输入。 这对放弃收到的不利于运行命令的不必要数据很有用。 键入下面的命令时,该命令不会返回任何内容:

Get-Command | Out-Null

Out-Null cmdlet 不会放弃错误输出。 例如,如果输入下面的命令,将显示一条消息,提醒你 PowerShell 没有识别 Is-NotACommand

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

打印数据

Out-Printer 仅在 Windows 平台上可用。

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

Get-Command -Name Get-* | Out-Printer -Name 'Microsoft Office Document Image Writer'

保存数据

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

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

如果你习惯使用传统的输出重定向,则使用 Out-File cmdlet 可能与你的预期结果有所不同。 若要了解其行为,必须知道运行 Out-File cmdlet 的上下文。

在 Window PowerShell 5.1 上,Out-File cmdlet 创建 Unicode 文件。 某些需要 ASCII 文件的工具不能在默认输出格式下正常工作。 可以使用 Encoding 参数将默认输出格式更改为 ASCII:

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

Out-file 将文件内容格式化为与控制台输出类似的形式。 这会导致输出被截断,就像大多数情况下在控制台窗口中一样。 例如,如果运行下面的命令:

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 最有用。