Cmdlet 概觀
Cmdlet 是 PowerShell 環境中使用的輕量型命令。 PowerShell 運行時間會在命令行提供的自動化腳本內容中叫用這些 Cmdlet。 PowerShell 運行時間也會透過PowerShell API以程式設計方式叫用它們。
Cmdlets
Cmdlet 會執行動作,通常會將Microsoft .NET 對象傳回管線中的下一個命令。 Cmdlet 是參與 PowerShell 管線語意的單一命令。 這包括二進位 (C#) Cmdlet、進階腳本函式、CDXML 和工作流程。
此 SDK 文件說明如何建立以 C# 撰寫的二進位 Cmdlet。 如需腳本型 Cmdlet 的相關信息,請參閱:
若要建立二進位 Cmdlet,您必須實作衍生自兩個特製化 Cmdlet 基類之一的 Cmdlet 類別。 衍生類別必須:
- 宣告將衍生類別識別為 Cmdlet 的屬性。
- 定義以屬性裝飾的公用屬性,這些屬性會將公用屬性識別為 Cmdlet 參數。
- 覆寫一或多個輸入處理方法來處理記錄。
您可以使用 Import-Module Cmdlet,直接載入包含 類別的元件,或者您可以使用 System.Management.Automation.Runspaces.InitialSessionState API 建立裝載應用程式來載入元件。 這兩種方法都提供以程序設計方式和命令行存取 Cmdlet 的功能。
Cmdlet 詞彙
PowerShell Cmdlet 文件中經常使用下列詞彙:
Cmdlet 屬性
用來將 Cmdlet 類別宣告為 Cmdlet 的 .NET 屬性。 雖然 PowerShell 使用其他數個選擇性屬性,但需要 Cmdlet 屬性。 如需此屬性的詳細資訊,請參閱 Cmdlet 屬性宣告。
Cmdlet 參數
定義可供使用者或執行 Cmdlet 之應用程式使用之參數的公用屬性。 Cmdlet 可以具有必要、具名、位置及 參數 參數。 Switch 參數可讓您定義只有在呼叫中指定參數時才會評估的參數。 如需不同參數類型的詳細資訊,請參閱 Cmdlet Parameters。
參數集
可用於相同命令以執行特定動作的參數群組。 Cmdlet 可以有多個參數集,但每個參數集必須至少有一個唯一的參數。 良好的 Cmdlet 設計強烈建議唯一參數也是必要的參數。 如需參數集的詳細資訊,請參閱 Cmdlet 參數集。
動態參數
在運行時間新增至 Cmdlet 的參數。 一般而言,當另一個參數設定為特定值時,動態參數會新增至 Cmdlet。 如需動態參數的詳細資訊,請參閱 Cmdlet 動態參數。
輸入處理方法
System.Management.Automation.Cmdlet 類別提供下列用來處理記錄的虛擬方法。 所有衍生的 Cmdlet 類別都必須覆寫前三個方法的一或多個:
- System.Management.Automation.Cmdlet.BeginProcessing:用來為 Cmdlet 提供選擇性的一次性前置處理功能。
- System.Management.Automation.Cmdlet.ProcessRecord:用來提供 Cmdlet 的記錄逐筆記錄處理功能。 System.Management.Automation.Cmdlet.ProcessRecord 方法可能會根據 Cmdlet 的輸入,呼叫次數或完全不呼叫。
- System.Management.Automation.Cmdlet.EndProcessing:用來為 Cmdlet 提供選擇性的一次性後置處理功能。
- System.Management.Automation.Cmdlet.StopProcessing:當使用者以異步方式停止 Cmdlet 時,用來停止處理 (例如,按下 CTRL +C)。
如需這些方法的詳細資訊,請參閱 Cmdlet 輸入處理方法。
當您實作 Cmdlet 時,必須覆寫至少其中一個輸入處理方法。 一般而言,ProcessRecord() 是您覆寫的方法,因為它會針對 Cmdlet 所處理的每個記錄呼叫。 相反地,BeginProcessing() 方法和 EndProcessing() 方法會呼叫一次來執行記錄的前置處理或後置處理。 如需這些方法的詳細資訊,請參閱 輸入處理方法。
ShouldProcess 功能
PowerShell 可讓您建立 Cmdlet,在 Cmdlet 對系統進行變更之前,先提示使用者提供意見反應。 若要使用這項功能,Cmdlet 必須在宣告 Cmdlet 屬性時宣告它支援 ShouldProcess
功能,而且 Cmdlet 必須從輸入處理方法內呼叫 System.Management.Automation.Cmdlet.ShouldProcessSystem.Management.Automation.Cmdlet.ShouldContinue 方法。 如需如何支援 ShouldProcess
功能的詳細資訊,請參閱 要求確認。
交易
視為單一工作的命令邏輯群組。 如果群組中的任何命令失敗,工作會自動失敗,而且使用者可以選擇接受或拒絕交易內執行的動作。 若要參與交易,Cmdlet 必須在宣告 Cmdlet 屬性時宣告它支援交易。 Windows PowerShell 2.0 引進了交易的支援。 如需交易的詳細資訊,請參閱 如何支援交易。
Cmdlet 與命令有何不同
Cmdlet 與其他命令殼層環境中的命令不同,方式如下:
- Cmdlet 是 .NET 類別的實例;它們不是獨立的可執行檔。
- Cmdlet 可以從十幾行程式代碼建立。
- Cmdlet 通常不會執行自己的剖析、錯誤呈現或輸出格式設定。 PowerShell 執行時間會處理剖析、錯誤呈現和輸出格式設定。
- Cmdlet 會處理管線中的輸入物件,而不是從文字數據流處理,而 Cmdlet 通常會將對象當作輸出傳遞至管線。
- Cmdlet 是記錄導向的,因為它們一次處理單一物件。
Cmdlet 基類
Windows PowerShell 支援衍生自下列兩個基類的 Cmdlet。
大部分 Cmdlet 是以衍生自 System.Management.Automation.Cmdlet 基類的 .NET 類別為基礎。 衍生自這個類別可讓 Cmdlet 在 Windows PowerShell 運行時間上使用最低相依性集。 這有兩個優點。 第一個優點是 Cmdlet 物件較小,而且您不太可能受到 PowerShell 運行時間變更的影響。 第二個優點是,如果您必須,您可以直接建立 Cmdlet 對象的實例,然後直接叫用它,而不是透過PowerShell運行時間叫用它。
更複雜的 Cmdlet 是以衍生自 System.Management.Automation.PSCmdlet 基類的 .NET 類別為基礎。 衍生自此類別可讓您更存取 PowerShell 運行時間。 此存取可讓您的 Cmdlet 呼叫腳本、存取提供者,以及存取目前的會話狀態。 (若要存取目前的會話狀態,您可以取得並設定會話變數和喜好設定。不過,衍生自這個類別會增加 Cmdlet 物件的大小,這表示您的 Cmdlet 與目前的 PowerShell 運行時間版本更緊密結合。
一般而言,除非您需要PowerShell運行時間的延伸存取權,否則您應該衍生自 System.Management.Automation.Cmdlet 類別。 不過,PowerShell 運行時間對於執行 Cmdlet 具有廣泛的記錄功能。 如果您的稽核模型相依於此記錄,您可以藉由衍生自 System.Management.Automation.PSCmdlet 類別,防止從另一個 Cmdlet 中執行 Cmdlet。
Cmdlet 屬性
PowerShell 會定義數個 .NET 屬性,這些屬性可用來管理 Cmdlet,並指定 PowerShell 所提供的一般功能,以及 Cmdlet 可能需要的功能。 例如,屬性可用來將類別指定為 Cmdlet、指定 Cmdlet 的參數,以及要求輸入的驗證,讓 Cmdlet 開發人員不需要在其 Cmdlet 程式代碼中實作該功能。 如需屬性的詳細資訊,請參閱 PowerShell 屬性。
Cmdlet 名稱
PowerShell 會使用動詞和名詞名稱組來命名 Cmdlet。 例如,PowerShell 中包含的 Get-Command
Cmdlet 可用來取得命令殼層中註冊的所有 Cmdlet。 動詞會識別 Cmdlet 執行的動作,而名詞會識別 Cmdlet 執行其動作的資源。
當 .NET 類別宣告為 Cmdlet 時,會指定這些名稱。 如需如何將 .NET 類別宣告為 Cmdlet 的詳細資訊,請參閱 Cmdlet 屬性宣告。
撰寫 Cmdlet 程式代碼
本檔提供兩種方式來探索 Cmdlet 程式代碼的撰寫方式。 如果您要檢視程式代碼,但沒有太多說明,請參閱 Cmdlet 程式代碼範例。 如果您想要進一步說明程序代碼,請參閱 GetProc 教學課程、StopProc 教學課程,或 SelectStr Tutorial 主題。
如需撰寫 Cmdlet 指導方針的詳細資訊,請參閱 Cmdlet 開發指導方針。