跳轉到內容

介紹 .NET Framework 3.0/Windows PowerShell

來自華夏公益教科書,為開放世界提供開放書籍

Windows PowerShell (代號:Monad) 是一種基於命令列的介面 (CLI)。它沒有隨 Windows Vista 的早期版本一起提供,但無論如何,它都可以在 Windows XP、Windows 2003 Server 和 Windows Vista 中使用。

Windows PowerShell 是 Exchange Server 2007、System Center Virtual Machine Manager 2007 和 System Center Operations Manager 2007 管理工具的基礎,其中所有操作都是透過命令列介面完成的,管理 GUI 則構建在這些命令之上。


Windows PowerShell 按照一個名為“單子論”的系統工作,該系統認為整個地球是由相互之間沒有聯絡的形而上學結構(稱為單子)組成的。Windows PowerShell 的“單子”是稱為“cmdlet”的物件。在 Windows Script Host 失敗後,微軟早在 2003 年就開始著手開發 Windows PowerShell。與 Windows Script Host 不同,Windows Powershell 直接與 shell 互動,並且具有很高的安全性。

Windows Powershell 不使用管道或流資料來進行服務之間的通訊,而是使用不同遠端機器上的兩個 cmdlet 之間的物件到物件的通訊。程序列表將不包含描述它們的文字,而是表示它們的“物件”,這樣就可以在這些物件上呼叫方法,而無需顯式引用任何外部結構或庫。

Windows PowerShell 在一個宿主應用程式(預設情況下為 powershell.exe)中執行,該應用程式向用戶公開命令列,並使用宿主介面與命令列呼叫的命令進行通訊。宿主應用程式可以是控制檯應用程式、Windows 應用程式或 Web 應用程式。在大多數情況下,宿主應用程式使用其 Main 函式透過內部宿主介面與 Windows PowerShell 執行時進行互動;但是,宿主應用程式可以選擇透過實現 PSHost 類以及一個或多個相關的使用者介面類來支援它自己的自定義宿主。這些類共同允許應用程式和 Windows PowerShell 命令之間的直接通訊。

建立執行空間

[編輯 | 編輯原始碼]

宿主應用程式在與 Windows PowerShell 執行時進行通訊時,必須首先執行的操作是建立執行空間,執行空間是 Windows PowerShell 執行時的抽象,用於簡化使用者會話。為此,宿主應用程式呼叫 RunspaceFactory 類的 CreateRunspace 方法。執行空間本身由 Runspace 物件表示。此外,Windows PowerShell 還提供了 RunspaceConfiguration 類來定義執行空間的配置。配置資訊包括有關宿主應用程式支援的命令和 Windows PowerShell 提供程式的資料,以及執行空間的啟動指令碼。使用者指令碼不會反映在執行空間配置中。當建立執行空間時,會自動開啟相應的會話,其狀態由 SessionState 物件表示。會話狀態資料包括有關 Windows PowerShell 路徑、Windows PowerShell 驅動器、Windows PowerShell 提供程式以及在會話期間處於活動狀態的 cmdlet 和其他命令的資訊。

開啟執行空間

[編輯 | 編輯原始碼]

當宿主應用程式建立執行空間後,它必須為所需的會話型別開啟執行空間。對於使用同步 I/O 的會話,應用程式可以呼叫 Open 方法。如果應用程式使用非同步 I/O 並且必須在執行空間完成讀/寫請求時執行其他操作,它可以呼叫 OpenAsync 方法。如果呼叫 OpenAsync,定義自定義宿主的宿主應用程式將需要支援適當的回撥方法來接收 I/O 通知。

開啟執行空間後,宿主應用程式可以透過在執行空間中建立和呼叫管道來操作會話,如“處理命令”中所述。

執行空間允許宿主應用程式透過呼叫會話的 SessionStateProxy 物件的 GetVariable 和 SetVariable 方法來操作會話。

建立管道

[編輯 | 編輯原始碼]

當宿主應用程式從使用者那裡收集到一個命令序列時,它必須將這些命令組合成一個或多個管道,每個管道由活動執行空間的 Pipeline 物件表示。

命令序列可以由多個巢狀管道組成,這些管道由分號 (;) 語句分隔符隔開。以下是一個此類序列的示例。

PS>pqr | bar; a | b

Windows PowerShell 執行時將此序列表示為一個管道,其中包含兩個巢狀管道,pqr | bar 和 a | b。

要建立自己的管道,宿主應用程式可以呼叫 CreatePipeline 方法或 CreateNestedPipeline 方法。應用程式呼叫 CreatePipeline 來形成一個空管道,或者如果它必須建立一個管道並用命令填充它。如果應用程式必須為執行空間建立一個管道,而其當前管道正在執行,則必須呼叫 CreateNestedPipeline。

啟動管道

[編輯 | 編輯原始碼]

現在管道已設定好,宿主應用程式必須啟動其操作。如果應用程式使用同步 I/O,則它呼叫 Invoke 方法,使用針對空管道或填充管道的變體。對於非同步 I/O,應用程式可以改為呼叫 InvokeAsync。

第一個版本包含以下特性

  • 一種類似 C# 的指令碼語言,支援雜湊表、可以對正則表示式進行測試的 switch 語句、陣列切片和匿名方法(指令碼塊),這些指令碼塊可以儲存為資料,然後在以後執行。它還提供了迴圈(for/foreach/while)、條件語句(if/switch)、變數作用域(全域性/指令碼/區域性)以及定義函式的能力。
  • Cmdlet 繼承了某些選項,允許使用者選擇互動級別以及如何處理錯誤。產生副作用的 cmdlet 支援 -WhatIf-Confirm 選項。-WhatIf 會通知使用者將會發生什麼,但不會執行任何操作。-Confirm 會通知使用者將要發生什麼,並允許使用者控制是否執行操作。
  • 處理錯誤的一個選項是呼叫“掛起”功能,該功能允許使用者進入一個新的命令 shell,調查問題,然後恢復原始命令。使用者可以定義在這種情況下顯示的提示。
  • 一個可擴充套件的 提供程式 模型允許訪問和操作檔案系統和其他層次結構資料儲存。一些示例:PowerShell 帶有一個登錄檔提供程式,允許透過“HKLM”和“HKCU”配置單元訪問登錄檔;使用它,可以透過在 shell 提示符處執行類似“dir HKLM:\SOFTWARE\Microsoft”的命令來瀏覽登錄檔。PowerShell 帶有證書儲存、環境以及 shell 函式和別名的提供程式。與 cmdlet 一樣,提供程式模型也是可擴充套件的,允許第三方建立自己的提供程式模型並將其插入 PowerShell。
  • 一個名為“執行策略”的概念,它允許對 PowerShell 指令碼執行施加粗粒度的安全約束。執行策略定義了 PowerShell 載入配置檔案和執行指令碼的限制。四種執行策略分別是:受限(Restricted)、全部簽署(AllSigned)、遠端簽署(RemoteSigned)和不受限(Unrestricted)。
  • 支援使用指令碼簽名來驗證指令碼釋出者的身份,並使用數字簽名驗證已釋出指令碼的完整性。
  • 命令列選項通常是完整的單詞,但可以指定為最少數量的字母以消除歧義。例如,選項 `-show-detailed-information` 可以輸入為 `-s`,如果其他選項沒有以 's' 開頭。
  • 全面且可擴充套件的選項卡自動完成功能。與 Bash 和 zsh 等 shell 中的高階自動完成功能相比,當前版本的 Windows 中的 cmd.exe shell 只能自動完成檔案或目錄名稱。
  • 能夠將命令的輸出分配給變數,該變數將成為一個物件或物件陣列,可以以任何想要的方式進行檢查。

參考資料

[編輯 | 編輯原始碼]
  1. http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx
  2. http://msdn2.microsoft.com/en-us/library/ms714658.aspx
華夏公益教科書