.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 指令碼宿主失敗後,微軟早在 2003 年就開始開發 Windows PowerShell。與 Windows 指令碼宿主不同,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 載入配置檔案和執行指令碼的限制。四種執行策略分別是受限、完全簽名、遠端簽名和不受限制。
- 支援使用指令碼簽名來驗證指令碼釋出者的身份,並使用數字簽名驗證已釋出指令碼的完整性。
- 命令列選項通常是完整的單詞,但可以指定為區分它們所需的最小字母數。例如,選項
-show-detailed-information如果沒有任何其他選項以“s”開頭,則可以輸入為-s。 - 全面且使用者可擴充套件的選項卡自動完成功能。當前版本的 Windows 中的 cmd.exe shell 只能完成檔案或目錄名稱,而與 Bash 和 zsh 等 shell 中的高階自動完成功能形成對比。
- 能夠將命令的輸出分配給變數,該變數隨後將成為物件或物件陣列,可以按任何所需的方式進行檢查。