Windows PowerShell 提供一組 cmdlet 讓您直接控制資料輸出。這些 Cmdlet 有兩個重要的共通特性。
第一,它們通常將資料轉換成某種文字格式。進行轉換是因為接受其輸出資料的系統元件需要文字輸入。這表示 cmdlet 必須將物件表示成文字。因此,文字會格式化為 Windows PowerShell 主控台視窗中顯示的樣子。
第二,這些 Cmdlet 使用 Windows PowerShell 動詞 Out,因為它們將資訊從 Windows PowerShell 送出至其他地方。Out-Host Cmdlet 並沒有例外:主控台視窗顯示畫面位於 Windows PowerShell 外部。這點很重要,因為當資料從 Windows PowerShell 送出後,資料隨即實際移除。為了證實此情況,您可以試著建立管線讓主控台視窗分頁顯示資料,然後嘗試將資料格式化為清單,如下所示:
PS> Get-Process | Out-Host -Paging | Format-List
依常理判斷,此命令應該會以清單格式分頁顯示處理序資訊。然而,實際上卻是顯示預設的表格式清單:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 101 5 1076 3316 32 0.05 2888 alg ... 618 18 39348 51108 143 211.20 740 explorer 257 8 9752 16828 79 3.02 2560 explorer ... <SPACE> next page; <CR> next line; Q quit ...
Out-Host Cmdlet 會直接將資料傳送至主控台,因此 Format-List 命令不曾收到任何資料可進行格式化。
建構此命令的正確做法是將 Out-Host Cmdlet 放在管線結尾,如下所示。這樣才會先將處理序資料格式化為清單,再進行分頁處理與顯示。
PS> Get-Process | Format-List | Out-Host -Paging Id : 2888 Handles : 101 CPU : 0.046875 Name : alg ... Id : 740 Handles : 612 CPU : 211.703125 Name : explorer Id : 2560 Handles : 257 CPU : 3.015625 Name : explorer ... <SPACE> next page; <CR> next line; Q quit ...
此原則適用於所有的 Out Cmdlet。Out Cmdlet 應一律放在管線結尾。
附註: | |
所有的 Out Cmdlet 均依主控台視窗的有效格式 (包括命令列長度限制) 將輸出轉換成文字。 |
分頁顯示主控台輸出 (Out-Host)
預設情況下,Windows PowerShell 將資料傳送至主控台視窗,而這正是 Out-Host Cmdlet 的工作。Out-Host Cmdlet 的主要用途 (如以上所討論) 是將資料分頁。例如,下列命令使用 Out-Host 將 Get-Command Cmdlet 的輸出分頁:
PS> Get-Command | Out-Host -Paging
您也可以使用 more 函數將資料分頁。在 Windows PowerShell 中,more 函數會呼叫 Out-Host -Paging。下列命令示範使用 more 函數將 Get-Command 的輸出分頁:
PS> Get-Command | more
如果 more 函數的引數指定為一或多個檔名,函數便會讀取指定的檔案並將檔案內容分頁顯示於主控台:
PS> more c:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] ...
捨棄輸出 (Out-Null)
Out-Null Cmdlet 是設計用來立即捨棄任何收到的輸入。您可藉此捨棄執行命令後附帶取得的不必要資料。輸入下列命令後不會傳回任何內容:
PS> Get-Command | Out-Null
Out-Null Cmdlet 不會捨棄錯誤輸出。例如,輸入下列命令將會顯示訊息指出 Windows PowerShell 無法辨識 'Is-NotACommand':
PS> Get-Command Is-NotACommand | Out-Null Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operabl e program, or script file. At line:1 char:12 + Get-Command <<<< Is-NotACommand | Out-Null
列印資料 (Out-Printer)
使用 Out-Printer Cmdlet 可以列印資料。如果沒有提供印表機名稱,Out-Printer Cmdlet 將使用預設印表機。您可指定任何 Windows 印表機的顯示名稱以表示要使用該印表機。即使沒有印表機連接埠對應甚或實體印表機也無妨。例如,假設您已安裝 Microsoft Office Document Imaging 工具,便可輸入下列命令將資料傳送至映像檔:
PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"
儲存資料 (Out-File)
使用 Out-File Cmdlet 可以將輸出傳送至檔案,而不傳送到主控台視窗。下列命令將處理序清單傳送至 C:\temp\processlist.txt 檔案:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt
如果您仍沿用傳統的輸出重新導向觀念,使用 Out-File Cmdlet 可能會產生非預期的結果。若要了解其行為模式,您必須知道 Out-File Cmdlet 運作的脈絡。
預設情況下,Out-File Cmdlet 會建立 Unicode 檔案。這是最通用的檔案格式,但也意味著接受 ASCII 檔案的工具無法正常使用預設輸出格式。您可以使用 Encoding 參數將預設輸出格式變更為 ASCII:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII
Out-file 會將檔案內容格式化為類似於主控台輸出的樣貌。在多數情況下,這會造成輸出被截斷,就跟主控台視窗中顯示的情形一樣。例如,如果執行下列命令:
PS> Get-Command | Out-File -FilePath c:\temp\output.txt
輸出結果看起來會像這樣:
CommandType Name Definition ----------- ---- ---------- Cmdlet Add-Content Add-Content [-Path] <String[... Cmdlet Add-History Add-History [[-InputObject] ... ...
如果不要讓輸出配合螢幕寬度強制換行,您可以使用 Width 參數指定行寬度。由於 Width 是 32 位元整數參數,其最大值可達 2147483647。下列命令將行寬度設為最大值:
Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647
Out-File Cmdlet 最適合用來儲存原應顯示於主控台的輸出。若要細部控制輸出格式,必須使用更進階的工具。下一章將介紹這些工具,以及物件操控的若干相關細節。