当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 重定向输出

作者:精品下载站 日期:2024-12-14 03:02:25 浏览:15 分类:玩电脑

重定向输出


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

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯