次の方法で共有


パイプライン入力を処理するパラメーターを追加する

コマンドレットの入力ソースの 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 を指定します。

パイプライン入力を受け入れるこの Get-Proc コマンドレットの Name パラメーターのパラメーター宣言を次に示します。

[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 キーワードを true に設定して、オブジェクトがパラメーターと同じ型の場合、または同じ型に強制できる場合に、Windows PowerShell ランタイムがパラメーターを受信オブジェクトにバインドできるようにします。 また、ValueFromPipelineByPropertyName キーワードは true に設定されているため、Windows PowerShell ランタイムは受信オブジェクトで Name プロパティをチェックします。 受信オブジェクトにこのようなプロパティがある場合、ランタイムは、Name パラメーターを受信オブジェクトの Name プロパティにバインドします。

パラメーターの ValueFromPipeline 属性キーワードの設定は、ValueFromPipelineByPropertyName キーワードの設定よりも優先されます。

入力処理メソッドのオーバーライド

コマンドレットがパイプライン入力を処理する場合は、適切な入力処理メソッドをオーバーライドする必要があります。 基本的な入力処理方法は、「最初のコマンドレット の作成で導入されています。

この Get-Proc コマンドレットは、System.Management.Automation.Cmdlet.ProcessRecord メソッド オーバーライドして、ユーザーまたはスクリプトによって提供される Name パラメーター入力を処理します。 このメソッドは、要求された各プロセス名のプロセスを取得します。名前が指定されていない場合は、すべてのプロセスを取得します。 System.Management.Automation.Cmdlet.ProcessRecord内では、WriteObject(System.Object,System.Boolean) の呼び出しが、出力オブジェクトをパイプラインに送信するための出力メカニズムであることに注意してください。 この呼び出しの 2 番目のパラメーター enumerateCollectionは、プロセス オブジェクトの配列を列挙し、コマンド ラインに一度に 1 つのプロセスを書き込むよう Windows PowerShell ランタイムに指示する 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 プロパティを持つプロセス オブジェクトを取得します。 この例では、Get-Process コマンドレット (Windows PowerShell によって提供) をアップストリーム コマンドとして使用して、"IEXPLORE" プロセスを取得します。

    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
    

こちらもご覧ください

コマンド ライン入力 を処理するパラメーターを追加する

最初のコマンドレット を作成する

オブジェクト型の拡張と書式設定

コマンドレット、プロバイダー、およびホスト アプリケーションを登録する方法

Windows PowerShell リファレンス

コマンドレットのサンプル