使用 Out- Cmdlet 重定向数据Redirecting Data with Out- Cmdlets

本文内容

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

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

第二,这些 cmdlet 使用 Windows PowerShell 谓词 Out,因为它们会将信息从 Windows PowerShell 发送到别处。Out-Host cmdlet 也不例外:主机窗口显示在 Windows PowerShell 之外。这一点尤为重要,原因是将数据发送出 Windows PowerShell 时,实际上已删除该数据。在你尝试创建用于将数据分页到主机窗口的管道,然后尝试将其格式化为列表时,可以看到此内容,如下所示:

  1. Get-Process | Out-Host -Paging | Format-List

你可能希望命令显示列表格式的进程信息页。但是,它将显示默认表格式列表:

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

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

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

  1. PS> Get-Process | Format-List | Out-Host -Paging
  2. Id : 2888
  3. Handles : 101
  4. CPU : 0.046875
  5. Name : alg
  6. ...
  7. Id : 740
  8. Handles : 612
  9. CPU : 211.703125
  10. Name : explorer
  11. Id : 2560
  12. Handles : 257
  13. CPU : 3.015625
  14. Name : explorer
  15. ...
  16. <SPACE> next page; <CR> next line; Q quit
  17. ...

这适用于所有 Out cmdlet。Out cmdlet 应始终出现在管道末尾。

备注

所有 Out cmdlet 都使用对控制台窗口有效的格式(包括行长度限制)将输出呈现为文本。

分页控制台输出 (Out-Host)Paging Console Output (Out-Host)

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

  1. Get-Command | Out-Host -Paging

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

  1. Get-Command | more

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

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

放弃输出 (Out-Null)Discarding Output (Out-Null)

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

  1. Get-Command | Out-Null

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

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

打印数据 (Out-Printer)Printing Data (Out-Printer)

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

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

保存数据 (Out-File)Saving Data (Out-File)

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

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

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

默认情况下,Out-File cmdlet 创建 Unicode 文件。从长远来看,这是最佳默认操作,但是它意味着应创建 ASCII 文件的工具将无法使用默认的输出格式正常运作。可以使用 Encoding 参数将默认输出格式更改为 ASCII:

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

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

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

输出将如下所示:

  1. CommandType Name Definition
  2. ----------- ---- ----------
  3. Cmdlet Add-Content Add-Content [-Path] <String[...
  4. Cmdlet Add-History Add-History [[-InputObject] ...
  5. ...

若要使不会强制换行的输出与屏幕宽度匹配,可以使用 Width 参数来指定行宽。因为 Width 是一个 32 位整数参数,因此其最大值可以是 2147483647。键入以下内容以将行宽设置为此最大值:

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

想要保存原本显示在控制台中的输出时,使用 Out-File cmdlet 最有用。若要更好地控制输出格式,需要更高级的工具。我们将在下一章中查看这些内容以及有关对象操作的一些详细信息。