管線作業在 Windows PowerShell 中幾乎隨處可見。雖然螢幕上顯示的是文字,Windows PowerShell 命令之間並非傳遞文字;而是傳遞物件。

管線採用的標記法和其他殼層很像,所以乍看之下可能會覺得 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 特定物件的結構、選取特定項目並將其格式化為方便顯示的樣子,以及傳送資訊到替代輸出位置如檔案和印表機。




目錄