共用方式為


Windows PowerShell:產生輸出的許多選擇

以 Windows PowerShell 產生輸出的方式.遠比您想像的還多。 這裡有最近出現的幾種方式。

Don Jones

我經常在一些優秀的產品中發現新的特性和功能,Windows PowerShell 就是其中之一。 生成輸出(螢幕上獲取資訊或轉換成一些其格式)是 Windows PowerShell 顯示其卓越的深度和通用性的一個方面。

打開 Windows PowerShell 的副本(最好是 v2,可下載能夠返回到 Windows XP 的 Windows 版本)並運行 Gcm –verb Out。 您將看到針對創建多種形式的輸出而設計的所有 cmdlet 的清單。

輸出如何發生

與 Windows PowerShell 中的所有內容一樣,設計各種 cmdlet 是為了使用物件。 這意味著可以通過運行如下所示的命令在螢幕(稱為主機視窗)上顯示輸出:

Get-Process | Out-Host

實際上,以上命令中的 Out-Host 部分不是必需的,因為 Windows PowerShell 已將 Out-Default cmdlet 硬編碼到管道末端。 該 cmdlet 只是將內容轉發到 Out-Host。 因此,以下命令:

Get-Process

與下麵的命令功能相同:

Get-Process | Out-Default

Out-Default 會在內部將物件轉發到 Out-Host。 所有 Out- cmdlet 有意思的地方在於它們無法實際處理“真實的”物件。 Out- cmdlet 只能處理由 shell 的格式化子系統生成的特殊類型的格式化物件。

如果 Out- cmdlet 接收到“普通的”物件,它會根據一組內部規則和配置預設值在內部調用其中一個 Format- cmdlet。 Format- cmdlet 將生成描述如何構建輸出的格式化物件,Out- cmdlet 將該輸出放入指定的設備。 因此,運行以下命令:

Get-Process

實際在很大程度上與運行下麵的命令類似:

Get-Process | Format-Table | Out-Host

此處得到的結論是 Out- cmdlet 只能使用由 Format- cmdlet 生成的物件。 大多數情況下,只有 Out- cmdlet 可以處理 Format- cmdlet 生成的物件。 因此,Format- cmdlet 將始終是命令列中的最後一個命令,唯一的例外是當它後面跟有 Out- cmdlet 時。

輸出:行的末尾

由於 Out- cmdlet 應該處理已運行的任何命令的最終結果,所以它們自己(有一個例外)不生成任何輸出。 如果正在使用 Out- cmdlet,它將始終是命令列中的最後一個命令。 在 Out- cmdlet 運行後,管道中將沒有任何物件供其他 cmdlet 執行操作。

此規則的唯一例外(至少對內置的 Out- cmdlet 來說)是 Out-String。 它與普通的 Out- cmdlet 的行為迥然不同。 它將 String 物件放置到管道中。 此 cmdlet 及其例外不是此處介紹的重點,但要知道存在這種情況。 如果您希望瞭解更多內容,請運行 Help Out-String。

Wait—did I say “built-in Out- cmdlets?” Indeed, and the implication that there are other Out- cmdlets is absolutely true. 例如,還有一個稱為 PowerGadgets 的協力廠商商業載入項。 這個載入項為您的 shell 庫中添加了有趣的 cmdlet,如 Out-Chart 和 Out-Gauge。 載入項 Out- cmdlet 顯示的規則和行為可能不會與此處列出的所有規則和行為相同,因此請務必閱讀其説明頁面(如果提供的話),以更好地瞭解它們的工作原理及可以執行的操作。

輸出選項

Windows PowerShell 帶有許多內置輸出選項:

  • 如果您沒有指定其他值,則 Out-Host 是預設選項
  • Out-Printer 將輸出發送到印表機。 此輸出是已經過您使用的 Format- cmdlet 或格式化子系統中的預設選項格式化的。
  • Out-File 將輸出發送到檔。 這在功能上與運行像 Dir >file.txt 這樣的命令相同。 >和 >>快速鍵在內部實際上使用的是 Out-File。 Out-File 有許多選項可以用來設置輸出檔寬度(這會影響 shell 所做的格式化決策)、字元編碼、附加或覆蓋等
  • Out-Grid 是 Windows PowerShell v2 中的新增項,要求 Microsoft .NET Framework 3.5 SP1 正常運行。 這將在圖表中顯示您的物件,該圖表中包含“按一下排序”列標題和搜索/篩選框來説明查找特定的結果

閱讀這些 cmdlet 的説明非常有指導意義。 例如,您是否知道 Out-Host 包含的 -paging 參數會導致它每次顯示一個輸出頁? 這類似于舊 Cmd.exe shell 中的“more”命令。 嘗試運行此命令:

Get-Service | Out-Host –paging

Out-File 的 –width 參數對創建特別寬的表格非常有用。 我生成了大量表格,並列印出繪圖器上生成的檔以創建一個排列整齊的壁掛式顯示圖。 預設寬度只有 80 列,而這不能容納非常寬的表格。 預設情況下,如果物件包含四列或更少的列,或者如果配置預設選項提供的是自訂表佈局,shell 才會以表格形式顯示這些物件:

Get-WmiObject Win32_Service | Format-Table * | 
Out-File c:\services.txt –width 750

Out-Printer 提供了 –name 參數,所以您可以指定要使用的印表機。 如果您沒有指定其他印表機,它將使用 Windows 預設印表機。

最後,Out-Grid 還允許您使用該 cmdlet 的 –title 參數指定顯示視窗的標題。 這在腳本向使用者顯示網格的情況下很有用,因為適當的標題可以説明使用者瞭解他們看到的內容。

當輸出不是您希望的物件時

最後介紹的是 Out-Null。 此 cmdlet 用於“吐掉”您不希望看到的輸出。 例如,大多數 Windows 管理規範方法返回的物件指示這些方法是成功還是失敗。 如果您不希望看到這樣的輸出,只需將其輸送到 Out-Null:

Invoke-WmiMethod –name reboot –class win32_operatingsystem | 
Out-Null

使用不同的輸出選項不僅為您帶來了樂趣,還能使您更好地瞭解 Windows PowerShell 可以執行的操作。 您將全面認識到工作可以更輕鬆到哪種程度以及獨立完成的工作可以減少到哪種程度。

Don Jones

Don Jones 是 Concentrated Technology 的創始人,他會在 ConcentratedTech.com 解答有關 Windows PowerShell 和其他技術的問題。 他也是 Nexus.Realtimepublishers.com 的撰稿人,他的許多著作還在他的網站上以電子版的形式提供。

相關內容