Windows PowerShell 的管线功能
DOS 或 UNIX shell 都能利用「管线符号」(pipeline symbol),将指令的执行结果移转到另一个指令,让另一个指令处理前一个指令转来的数据。Windows PowerShell 的管线符号也是 |,例如之前用过的 get-help * | more,就是将 get-help * 的结果转给 more,而 more 会让结果显示满整个窗口就暂停。
管线是各种 shell 环境的「黏合」非常好的例证,例如管线就黏合了 Windows PowerShell 的各个指令,进而让各个指令完成一件工作。再举几个管线的例子。首先是:
ipconfig | findstr "Address"
被管线黏合的 ipconfig 和 findstr 都是 Win32 既有的外部指令,前者会显示、设定计算机的 IP 地址,后者则能以各种方式找出特定字符串。以上的叙述是将 ipconfig 的执行结果转给 findstr,并让 findstr 找出执行结果的 Address 字符串。
图 2 ipconfig | findstr "Address"执行结果
再举两个例子。以下的叙述会列出已停止的系统服务,但是由 get-service 和 where-object 相互协力完成,前者列出所有的系统服务,后者过滤出状态为 Stopped 的系统服务:
get-service | where-object {$_.Status -eq "Stopped"}
但以上叙述的结果会以系统服务的名称作为排列方式,若想以系统服务的「显示名称」依序排列,可以再加上 sort-object,并也以管线黏合:
get-service | where-object {$_.Status -eq "Stopped"} | sort-object -property DisplayName
图 3 三重管线范例的执行结果