实际上,在 Windows PowerShell 中到处都会用到管道。尽管在屏幕上会看到文本,但 Windows PowerShell 并不通过管道在命令之间传递文本。它实际上通过管道传递对象。
用于管道的表示法与其他 shell 中所使用的表示法十分类似,因此,乍一看可能不会明显察觉到 Windows PowerShell 引入了新功能。例如,如果使用 Out-Host cmdlet 来强制逐页显示其他命令的输出,则该输出的外观将与屏幕上显示的正常文本一样,分为多页显示:
PS> Get-ChildItem -Path C:\WINDOWS\System32 | Out-Host -Paging Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\system32 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2005-10-22 11:04 PM 315 $winnt$.inf -a--- 2004-08-04 8:00 AM 68608 access.cpl -a--- 2004-08-04 8:00 AM 64512 acctres.dll -a--- 2004-08-04 8:00 AM 183808 accwiz.exe -a--- 2004-08-04 8:00 AM 61952 acelpdec.ax -a--- 2004-08-04 8:00 AM 129536 acledit.dll -a--- 2004-08-04 8:00 AM 114688 aclui.dll -a--- 2004-08-04 8:00 AM 194048 activeds.dll -a--- 2004-08-04 8:00 AM 111104 activeds.tlb -a--- 2004-08-04 8:00 AM 4096 actmovie.exe -a--- 2004-08-04 8:00 AM 101888 actxprxy.dll -a--- 2003-02-21 6:50 PM 143150 admgmt.msc -a--- 2006-01-25 3:35 PM 53760 admparse.dll <SPACE> next page; <CR> next line; Q quit ...
无论何时希望缓慢显示冗长的输出,Out-Host -Paging 命令都是一个非常有用的管道元素。在操作占用大量 CPU 资源时,此命令尤其有用。由于在准备显示完整页面时处理工作将转到 Out-Host cmdlet,因此管道中的前一个 cmdlet 将暂停操作,直至下一页输出可以显示为止。如果使用 Windows 任务管理器来监视 Windows PowerShell 的 CPU 和内存使用率,您将会看到这一情况。
运行以下命令:Get-ChildItem C:\Windows -Recurse。将 CPU 和内存使用率与以下命令相比较:Get-ChildItem C:\Windows -Recurse | Out-Host -Paging。您将在屏幕上看到文本,但这是由于需要在控制台窗口中以文本形式表示对象。这只是 Windows PowerShell 内部实际发生的情况的一种表现形式。我们以 Get-Location cmdlet 为例。如果当前位置是 C 驱动器的根目录,此时键入 Get-Location 将会显示以下输出:
PS> Get-Location Path ---- C:\
如果 Windows PowerShell 通过管道传递文本,则发出 Get-Location | Out-Host 等命令会将一组字符按其在屏幕上的显示顺序从 Get-Location 传递到 Out-Host。换而言之,如果要忽略标题信息,Out-Host 会首先接收字符 'C',再接收字符 ':',然后接收字符 '\'。Out-Host cmdlet 无法确定与 Get-Location cmdlet 输出的字符相关联的含义。
Windows PowerShell 使用对象而不是使用文本来实现管道中的命令通信。从用户的角度来看,对象将相关信息打包为一种便于将信息作为一个单元进行操作的形式,并提取所需的特定项目。
Get-Location 命令不返回包含当前路径的文本。它返回一个称为 PathInfo 对象的信息包,其中包含当前路径以及其他一些信息。Out-Host cmdlet 随后会将此 PathInfo 对象发送到屏幕,然后由 Windows PowerShell 决定要显示的信息以及如何基于其格式规则来显示该信息。
实际上,作为设置数据在屏幕上的显示格式的过程的一部分,仅在该过程结束时才添加 Get-Location cmdlet 输出的标题信息。屏幕上所显示的内容为信息摘要,而不是输出对象的完整表现形式。
假定 Windows PowerShell 命令输出的信息多于我们在控制台窗口中看到的显示内容,如何才能检索不可见的元素?如何查看额外的数据?此外,如果希望采用非 Windows PowerShell 常用格式的其他格式来查看数据,该怎么办?
本章的其余部分将为您介绍如何发现特定 Windows PowerShell 对象的结构、如何选择特定项目并设置其格式以便于显示,以及如何将此信息发送到备选输出位置(例如,文件和打印机)。