次の方法で共有


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

コマンドレットの入力ソースの 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 PowerShell Get-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
    

参照

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

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

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

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

Windows PowerShell リファレンス

コマンドレット サンプル