Cmdlet 的一個輸入來源是命令行。 本主題描述如何將參數新增至 Get-Proc Cmdlet(如 建立您的第一個 Cmdlet中所述),讓 Cmdlet 可以根據傳遞至 Cmdlet 的明確對象來處理本機計算機的輸入。 此處所述的 Get-Proc Cmdlet 會根據其名稱擷取進程,然後在命令提示字元中顯示處理程式的相關信息。
定義 Cmdlet 類別
Cmdlet 建立的第一個步驟是 Cmdlet 命名,以及實作 Cmdlet 之 .NET Framework 類別的宣告。 此 Cmdlet 會擷取進程資訊,因此此處選擇的動詞名稱為 「Get」。(幾乎任何能夠擷取資訊的 Cmdlet 都可以處理命令行輸入。如需已核准 Cmdlet 動詞的詳細資訊,請參閱 Cmdlet 指令動詞名稱。
以下是 Get-Proc Cmdlet 的類別宣告。
建立您的第一個 Cmdlet中會提供此定義的詳細數據。
[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand: Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
宣告參數
Cmdlet 參數可讓使用者提供 Cmdlet 的輸入。 在下列範例中,Get-Proc 和 Get-Member 是管線 Cmdlet 的名稱,而 MemberType 是 Get-Member Cmdlet 的參數。 參數具有自變數 「property」。。
PS> Get-Proc ;Get-Member -MemberType 屬性
若要宣告 Cmdlet 的參數,您必須先定義代表參數的屬性。 在 Get-Proc Cmdlet 中,唯一的參數是 Name,在此案例中代表要擷取之 .NET Framework 進程對象的名稱。 因此,Cmdlet 類別會定義字串類型的屬性,以接受名稱陣列。
以下是 Get-Proc Cmdlet Name 參數的參數宣告。
/// <summary>
/// Specify the cmdlet Name parameter.
/// </summary>
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
#endregion Parameters
<Parameter(Position:=0), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
若要通知 Windows PowerShell 運行時間此屬性是 Name 參數,System.Management.Automation.ParameterAttribute 屬性會新增至屬性定義。 宣告此屬性的基本語法是 [Parameter()]。
備註
參數必須明確標示為公用。 Windows PowerShell 運行時間未標示為公用預設值且找不到的參數。
此 Cmdlet 會針對 Name 參數使用字串數位。 可能的話,您的 Cmdlet 也應該將參數定義為數位,因為這可讓 Cmdlet 接受多個專案。
關於參數定義的注意事項
應盡可能重複使用預先定義的 Windows PowerShell 參數名稱和數據類型,以確保您的 Cmdlet 與 Windows PowerShell Cmdlet 相容。 例如,如果所有 Cmdlet 都使用預先定義的
Id參數名稱來識別資源,則無論其使用哪一個 Cmdlet,用戶都會輕鬆地了解參數的意義。 基本上,參數名稱遵循與 Common Language Runtime (CLR) 中變數名稱所使用的規則相同。 如需參數命名的詳細資訊,請參閱 Cmdlet 參數名稱。Windows PowerShell 會保留幾個參數名稱,以提供一致的用戶體驗。 請勿使用這些參數名稱:
WhatIf、Confirm、Verbose、Debug、Warn、ErrorAction、ErrorVariable、OutVariable和OutBuffer。 此外,這些參數名稱的下列別名會保留:vb、db、ea、ev、ov和ob。Name是簡單且常見的參數名稱,建議您在 Cmdlet 中使用。 最好選擇類似這樣的參數名稱,而不是特定 Cmdlet 唯一且難以記住的複雜名稱。參數在 Windows PowerShell 中不區分大小寫,但根據預設,殼層會保留大小寫。 自變數的區分大小寫取決於 Cmdlet 的作業。 自變數會傳遞至命令行中指定的參數。
如需其他參數宣告的範例,請參閱 Cmdlet 參數。
將參數宣告為位置或具名
Cmdlet 必須將每個參數設定為位置或具名參數。 這兩種參數都接受單一自變數、以逗號分隔的多個自變數,以及布爾設定。 布爾參數,也稱為 參數,只會處理布爾設定。 參數是用來判斷參數是否存在。 建議預設值為 false。
範例 Get-Proc Cmdlet 會將 Name 參數定義為位置 0 的位置參數。這表示使用者於命令行上輸入的第一個自變數會自動插入此參數。 如果您想要定義具名參數,用戶必須從命令行指定參數名稱,請將 Position 關鍵詞保留在屬性宣告外。
備註
除非必須命名參數,否則我們建議您將最常使用的參數位置設為 ,讓使用者不必輸入參數名稱。
將參數宣告為強制或選擇性
Cmdlet 必須將每個參數設定為選擇性或必要參數。 在範例 Get-Proc Cmdlet 中,Name 參數會定義為選擇性,因為屬性宣告中未設定 Mandatory 關鍵詞。
支援參數驗證
範例 Get-Proc Cmdlet 會將輸入驗證屬性 System.Management.Automation.ValidateNotNullOrEmptyAttribute新增至 Name 參數,以啟用輸入既不是 null 也不是空的驗證。 此屬性是 Windows PowerShell 所提供的數個驗證屬性之一。 如需其他驗證屬性的範例,請參閱 驗證參數輸入。
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name
覆寫輸入處理方法
如果您的 Cmdlet 是處理命令行輸入,則必須覆寫適當的輸入處理方法。 建立您的第一個 Cmdlet中引進基本輸入處理方法。
Get-Proc Cmdlet 會覆寫 System.Management.Automation.Cmdlet.ProcessRecord 方法來處理使用者或腳本所提供的 Name 參數輸入。 這個方法會取得每個要求的進程名稱,如果未提供任何名稱,則為進程取得所有進程。 請注意,System.Management.Automation.Cmdlet.ProcessRecord中,呼叫 System.Management.Automation.Cmdlet.WriteObject 是將輸出物件傳送至管線的輸出機制。 這個呼叫的第二個參數 enumerateCollection會設定為 true,以通知 Windows PowerShell 運行時間列舉進程對象的輸出數位,並一次將一個進程寫入命令行。
protected override void ProcessRecord()
{
// If no process names are passed to the cmdlet, get all processes.
if (processNames == null)
{
// Write the processes to the pipeline making them available
// to the next cmdlet. The second argument of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(Process.GetProcesses(), true);
}
else
{
// If process names are passed to the cmdlet, get and write
// the associated processes.
foreach (string name in processNames)
{
WriteObject(Process.GetProcessesByName(name), true);
}
}
}
Protected Overrides Sub ProcessRecord()
'/ If no process names are passed to the cmdlet, get all processes.
If processNames Is Nothing Then
Dim processes As Process()
processes = Process.GetProcesses()
End If
'/ If process names are specified, write the processes to the
'/ pipeline to display them or make them available to the next cmdlet.
For Each name As String In processNames
'/ The second parameter of this call tells PowerShell to enumerate the
'/ array, and send one process at a time to the pipeline.
WriteObject(Process.GetProcessesByName(name), True)
Next
End Sub 'ProcessRecord
程式碼範例
如需完整的 C# 範例程式代碼,請參閱 GetProcessSample02 範例。
定義物件類型和格式設定
Windows PowerShell 會使用 .NET Framework 物件在 Cmdlet 之間傳遞資訊。 因此,Cmdlet 可能需要定義自己的類型,或 Cmdlet 可能需要擴充另一個 Cmdlet 所提供的現有類型。 如需定義新類型或擴充現有類型的詳細資訊,請參閱 擴充物件類型和格式。
建置 Cmdlet
實作 Cmdlet 之後,您必須使用 Windows PowerShell 嵌入式管理單元向 Windows PowerShell 註冊它。 如需註冊 Cmdlet 的詳細資訊,請參閱 如何註冊 Cmdlet、提供者和主應用程式。
測試 Cmdlet
當您的 Cmdlet 向 Windows PowerShell 註冊時,您可以在命令行上執行 Cmdlet 來測試它。 以下是測試範例 Cmdlet 程式代碼的兩種方式。 如需從命令行使用 Cmdlet 的詳細資訊,請參閱 開始使用 Windows PowerShell。
在 Windows PowerShell 提示字元中,使用下列命令列出名為 “IEXPLORE” 的 Internet Explorer 進程。
Get-Proc -Name iexplore下列輸出隨即出現。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 354 11 10036 18992 85 0.67 3284 iexplore若要列出名為 「IEXPLORE」、“OUTLOOK” 和 「NOTEPAD」 的 Internet Explorer、Outlook 和記事本程式,請使用下列命令。 如果有多個進程,則會顯示所有進程。
Get-Proc -Name iexplore, outlook, notepad下列輸出隨即出現。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 732 21 24696 5000 138 2.25 2288 iexplore 715 19 20556 14116 136 1.78 3860 iexplore 3917 62 74096 58112 468 191.56 1848 OUTLOOK 39 2 1024 3280 30 0.09 1444 notepad 39 2 1024 356 30 0.08 3396 notepad