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

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

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

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

    1. ------- ------ ----- ----- ----- ------ -- -----------
    2. 101 5 1076 3316 32 0.05 2888 alg
    3. ...
    4. 618 18 39348 51108 143 211.20 740 explorer
    5. 257 8 9752 16828 79 3.02 2560 explorer
    6. ...
    7. <SPACE> next page; <CR> next line; Q quit
    8. ...

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

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

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

    这适用于所有 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 的输出进行分页:

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

    1. [boot loader]
    2. timeout=5
    3. default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    4. [operating systems]
    5. ...

    放弃输出 (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-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

    输出将如下所示:

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