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 最適合用來儲存原應顯示於主控台的輸出。若要細部控制輸出格式,必須使用更進階的工具。下一章將介紹這些工具,以及物件操控的若干相關細節。




目錄