管道并不是什么新事物,以前的Cmd控制台也有重定向的命令,例如Dir | More可以将结果分屏显示。
传统的Cmd管道是基于文本的,但是Powershell是基于对象。
PS> ls | Sort-Object -Descending Name | Select-Object Name,Length,LastWriteTime | ConvertTo-Html | Out-File ls.html PS> Get-Content .ls.html
Name Length LastWriteTime test.vbs 170 2011/11/28 16:42:03 test.txt 242 2011/11/23 17:37:37 test.ps1 140 2011/12/2 18:47:35 psdrive.html 2556 2011/11/30 16:04:00 Powershell_Cmdlets.html 735892 2011/11/24 17:44:37 ping.bat 63 2011/11/28 15:30:04 name.html 7420 2011/11/24 17:37:28 myscript 2011/11/29 18:21:28 ls.html 434 2011/12/14 11:22:30 LogoTestConfig.xml 186 2011/11/28 11:12:08 function.ps1 21466 2011/11/29 19:23:58 employee.xml 556 2011/11/25 11:20:33 d.txt 0 2011/11/23 17:25:23 c.txt 0 2011/11/23 17:25:23 b.txt 0 2011/11/23 17:25:23 alias.ps1 12060 2011/11/24 20:27:24 alias 12060 2011/11/24 20:26:36 ABC 2011/11/23 17:25:53 a.txt 26384 2011/11/24 20:04:31 a.html 67580 2011/11/24 18:30:13
首先列出当前目录下的目录和文件,然后根据文件名降序排列,再投影文件名,文件大小,文件的修改时间,转换成Html格式,输出到当前目录的ls.html
面向对象的管道
上面的例子属于面向对象的管道,每个命令的末尾可以使用新的命令对上个命令的结果做进一步处理,除非管道是以输出命令结束的。就像Sort-Object一样,对文件的列表进行排序,需要告诉它排序的关键字,按照升序还是降序。ls的返回值为一个数组,数组中的每一个元素都是一个对象,对象的每一个属性都可以作为Sort-Object的排序关键字。但是排序时必须指定一个具体的关键字,因为Powershell所传递的对象可能有很多属性。不像普通的文本,对象的信息都是结构化的,因此也使得Powershell的管道变得更加强大和方便。
转换命令执行的结果为文本
在执行Powershell命令时,解释器会默认在命令的结尾追加一个管道命令,Out-Default,这样可以将原来的对象结果以文本的形式显示在控制台上,但是并没有将结果进行转换,所以可以继续使用其它管道对对象的结果进行操作,但是一旦使用了诸如ConvertTo-Html这样的命令后,就会将结果转换成固定格式的纯文本。
常用的对管道结果进一步处理的命令有:
Compare-Object: 比较两组对象。
ConvertTo-Html: 将 Microsoft .NET Framework 对象转换为可在 Web 浏览器中显示的 HTML。
Export-Clixml: 创建对象的基于 XML 的表示形式并将其存储在文件中。
Export-Csv: 将 Microsoft .NET Framework 对象转换为一系列以逗号分隔的、长度可变的 (CSV) 字符串,并将这些字符串保存到
一个 CSV 文件中。
ForEach-Object: 针对每一组输入对象执行操作。










