パイプライン入力を処理するパラメーターを追加する
コマンドレットの入力ソースの 1 つは、アップストリーム コマンドレットから送信されるパイプライン上のオブジェクトです。 このセクションでは、パラメーターを Get-Proc コマンドレットに追加する方法について説明します(「最初のコマンドレットの作成」で説明)、コマンドレットでパイプライン オブジェクトを処理できます。
この Get-Proc コマンドレットでは、パイプライン オブジェクトからの入力を受け取り、指定された名前に基づいてローカル コンピューターからプロセス情報を取得し、コマンド ラインでプロセスに関する情報を表示するパラメーターを使用します。 Name
コマンドレット クラスの定義
コマンドレットの作成の最初の手順は、常にコマンドレットに名前を付け、コマンドレットを実装する .NET クラスを宣言します。 このコマンドレットはプロセス情報を取得します。そのため、ここで選択した動詞名は "Get" です。 (情報を取得できるほとんどすべての種類のコマンドレットは、コマンド ライン入力を処理できます)。承認されたコマンドレット動詞の詳細については、「コマンドレット動詞名」 を参照してください。
このコマンドレットの定義を次Get-Procします。 この定義の詳細については、「最初のコマンドレット の作成」を参照してください。
[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
パイプラインからの入力の定義
このセクションでは、コマンドレットのパイプラインからの入力を定義する方法について説明します。 このGet-Proc、コマンド ライン入力を処理するパラメーターの追加に関するページの説明に従って、 パラメーターを表す Name
プロパティを定義します。
(パラメーターの宣言に関する一般的な情報については、このトピックを参照してください)。
ただし、コマンドレットがパイプライン入力を処理する必要がある場合は、そのパラメーターがランタイムによって入力値にバインドWindows PowerShellがあります。 これを行うには、 キーワードを追加するか ValueFromPipeline
、キーワードを ValueFromPipelineByProperty
System.Management.Automation.Parameterattribute 属性宣言に追加する必要があります。 コマンドレットが ValueFromPipeline
完全な入力オブジェクトにアクセスする場合は、 キーワードを指定します。 コマンドレットが ValueFromPipelineByProperty
オブジェクトの プロパティにのみアクセスする場合は、 を指定します。
パイプライン入力を受け入れるこのコマンドレット Name
のパラメーターGet-Proc宣言を次に示します。
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return this.processNames; }
set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
前の宣言では、 キーワードが に設定され、オブジェクトがパラメーターと同じ型の場合、または同じ型に設定できる場合は ValueFromPipeline
、Windows PowerShell ランタイムがパラメーターを受信オブジェクトにバインドします。 true
キーワードも に設定されます。この場合、ランタイムWindows PowerShell受信オブジェクトのプロパティ ValueFromPipelineByPropertyName
true
がチェック Name
されます。 受信オブジェクトにこのようなプロパティがある場合、ランタイムはパラメーターを受信オブジェクト Name
Name
の プロパティにバインドします。
注意
パラメーターの属性キーワード ValueFromPipeline
の設定は、 キーワードの設定よりも優先 ValueFromPipelineByPropertyName
されます。
入力処理メソッドのオーバーライド
コマンドレットでパイプライン入力を処理する場合は、適切な入力処理メソッドをオーバーライドする必要があります。 基本的な入力処理方法については、「最初のコマンドレットの作成 」を参照してください。
この Get-Proc、System.Management.Automation.Cmdlet.ProcessRecord メソッドをオーバーライドして、ユーザーまたはスクリプトによって提供されるパラメーター入力 Name
を処理します。 このメソッドは、要求されたプロセス名ごとにプロセスを取得します。名前が指定されている場合は、すべてのプロセスを取得します。 System.Management.Automation.Cmdlet.ProcessRecord内では、WriteObject(System.Object,System.Boolean)の呼び出しが、出力オブジェクトをパイプラインに送信するための出力メカニズムです。 この呼び出しの 2 番目のパラメーター は に設定され、Windows PowerShell ランタイムにプロセス オブジェクトの配列を列挙し、コマンド ラインに一度に 1 つのプロセスを書き込みます enumerateCollection
true
。
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);
} // End foreach (string name...).
}
}
Protected Overrides Sub ProcessRecord()
Dim processes As Process()
'/ If no process names are passed to the cmdlet, get all processes.
If processNames Is Nothing Then
processes = Process.GetProcesses()
Else
'/ 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 If
End Sub 'ProcessRecord
コード サンプル
完全な C# サンプル コードについては 、「GetProcessSample03 サンプル」を参照してください。
オブジェクト型と書式設定の定義
Windows PowerShell.Net オブジェクトを使用してコマンドレット間で情報を渡します。 そのため、コマンドレットで独自の型を定義する必要がある場合や、別のコマンドレットによって提供される既存の型を拡張する必要がある場合があります。 新しい型の定義または既存の型の拡張の詳細については、「オブジェクト型の拡張」および「書式設定」 を参照してください。
コマンドレットの構築
コマンドレットを実装した後、 スナップインを使用してWindows PowerShellに登録Windows PowerShell必要があります。 コマンドレットの登録の詳細については、「コマンドレット、プロバイダー、およびホスト アプリケーションを登録する方法」 を参照してください。
コマンドレットのテスト
コマンドレットが Windows PowerShellに登録されている場合は、コマンド ラインで実行してテストします。 たとえば、サンプル コマンドレットのコードをテストします。 コマンド ラインからコマンドレットを使用する方法の詳細については、「 コマンド ラインを使用したはじめにをWindows PowerShell。
プロンプトでWindows PowerShell次のコマンドを入力して、パイプラインを介してプロセス名を取得します。
PS> type ProcessNames | get-proc
次のような出力が表示されます。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 809 21 40856 4448 147 9.50 2288 iexplore 737 21 26036 16348 144 22.03 3860 iexplore 39 2 1024 388 30 0.08 3396 notepad 3927 62 71836 26984 467 195.19 1848 OUTLOOK
次の行を入力して、"IEXPLORE" というプロセスから プロパティを持つプロセス オブジェクト
Name
を取得します。 この例では、"IEXPLORE" プロセスを取得するアップストリーム コマンドとして、 (Windows PowerShellGet-Process
によって提供される) コマンドレットを使用します。PS> get-process iexplore | get-proc
次のような出力が表示されます。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore