次の方法で共有


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

コマンドレットの入力ソースの 1 つはコマンド ラインです。 このトピックでは、コマンドレットに渡された明示的なオブジェクトに基づいてローカル コンピューターからの入力を処理できるように、Get-Proc コマンドレットにパラメーターを追加する方法について説明します (最初のコマンドレット の作成を参照)。 ここで説明する Get-Proc コマンドレットは、その名前に基づいてプロセスを取得し、コマンド プロンプトでプロセスに関する情報を表示します。

コマンドレット クラスの定義

コマンドレットの作成の最初の手順は、コマンドレットの名前付けと、コマンドレットを実装する .NET Framework クラスの宣言です。 このコマンドレットはプロセス情報を取得するため、ここで選択した動詞名は "Get" です。(情報を取得できるほぼすべての種類のコマンドレットで、コマンド ライン入力を処理できます)。承認されたコマンドレット動詞の詳細については、「コマンドレットの動詞名 を参照してください。

Get-Proc コマンドレットのクラス宣言を次に示します。 この定義の詳細については、「最初のコマンドレット の作成」を参照してください。

[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand: Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

パラメーターの宣言

コマンドレット パラメーターを使用すると、ユーザーはコマンドレットに入力を提供できます。 次の例では、Get-ProcGet-Member はパイプライン化されたコマンドレットの名前であり、MemberTypeGet-Member コマンドレットのパラメーターです。 パラメーターには引数 "property" があります。

PS> Get-Proc;Get-Member -MemberType プロパティの

コマンドレットのパラメーターを宣言するには、まず、パラメーターを表すプロパティを定義する必要があります。 Get-Proc コマンドレットでは、唯一のパラメーターは Nameです。この場合は、取得する .NET Framework プロセス オブジェクトの名前を表します。 したがって、コマンドレット クラスは、名前の配列を受け入れる文字列型のプロパティを定義します。

Get-Proc コマンドレットの 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

このプロパティが Name パラメーターであることを Windows PowerShell ランタイムに通知するために、System.Management.Automation.ParameterAttribute 属性がプロパティ定義に追加されます。 この属性を宣言するための基本的な構文は [Parameter()]です。

パラメーターは明示的にパブリックとしてマークする必要があります。 パブリックの既定値として内部としてマークされておらず、Windows PowerShell ランタイムで見つからないパラメーター。

このコマンドレットは、Name パラメーターに文字列の配列を使用します。 可能な場合は、コマンドレットで複数の項目を受け取ることができるため、パラメーターを配列として定義する必要もあります。

パラメーター定義について覚えておくべき事項

  • 定義済みの Windows PowerShell パラメーター名とデータ型は、コマンドレットが Windows PowerShell コマンドレットと互換性があることを確認するために、できるだけ再利用する必要があります。 たとえば、すべてのコマンドレットで定義済みの Id パラメーター名を使用してリソースを識別する場合、ユーザーは使用しているコマンドレットに関係なく、パラメーターの意味を簡単に理解できます。 基本的に、パラメーター名は、共通言語ランタイム (CLR) の変数名に使用されるものと同じ規則に従います。 パラメーターの名前付けの詳細については、「コマンドレット パラメーター名の」を参照してください。

  • Windows PowerShell では、一貫性のあるユーザー エクスペリエンスを提供するために、いくつかのパラメーター名が予約されています。 WhatIfConfirmVerboseDebugWarnErrorActionErrorVariableOutVariable、および OutBufferのパラメーター名は使用しないでください。 さらに、これらのパラメーター名には、vbdbeaevov、および obのエイリアスが予約されています。

  • Name は単純で一般的なパラメーター名であり、コマンドレットで使用することをお勧めします。 特定のコマンドレットに固有で覚えにくい複雑な名前よりも、このようなパラメーター名を選択することをお勧めします。

  • パラメーターでは、Windows PowerShell では大文字と小文字が区別されませんが、既定ではシェルでは大文字と小文字が保持されます。 引数の大文字と小文字の区別は、コマンドレットの操作によって異なります。 引数は、コマンド ラインで指定されたパラメーターに渡されます。

  • その他のパラメーター宣言の例については、「コマンドレット パラメーターの 」を参照してください。

パラメーターを位置指定または名前付きとして宣言する

コマンドレットでは、各パラメーターを位置指定パラメーターまたは名前付きパラメーターとして設定する必要があります。 どちらの種類のパラメーターも、1 つの引数、コンマで区切られた複数の引数、およびブール値の設定を受け入れます。 ブール値パラメーターは、スイッチとも呼ばれ、ブール値の設定のみを処理します。 スイッチは、パラメーターの存在を判断するために使用されます。 推奨される既定値は falseです。

サンプル Get-Proc コマンドレットでは、Name パラメーターを位置 0 の位置パラメーターとして定義します。つまり、ユーザーがコマンド ラインで最初に入力した引数は、このパラメーターに対して自動的に挿入されます。 ユーザーがコマンド ラインからパラメーター名を指定する必要がある名前付きパラメーターを定義する場合は、Position キーワードを属性宣言から除外します。

パラメーターに名前を付ける必要がない限り、ユーザーがパラメーター名を入力する必要がないように、最も使用されるパラメーターを位置指定することをお勧めします。

パラメーターを必須または省略可能として宣言する

コマンドレットでは、各パラメーターを省略可能または必須のパラメーターとして設定する必要があります。 サンプル Get-Proc コマンドレットでは、Mandatory キーワードが属性宣言で設定されていないため、Name パラメーターは省略可能として定義されています。

パラメーター検証のサポート

サンプル Get-Proc コマンドレットは、入力が null でも空でもない検証を有効にするために、Name パラメーターに入力検証属性 System.Management.Automation.ValidateNotNullOrEmptyAttributeを追加します。 この属性は、Windows PowerShell によって提供されるいくつかの検証属性の 1 つです。 その他の検証属性の例については、「パラメーター入力の検証」を参照してください。

[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name

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

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

Get-Proc コマンドレットは、System.Management.Automation.Cmdlet.ProcessRecord メソッド オーバーライドして、ユーザーまたはスクリプトによって提供される Name パラメーター入力を処理します。 このメソッドは、要求された各プロセス名のプロセスを取得します。または、名前が指定されていない場合はプロセスのすべてのプロセスを取得します。 System.Management.Automation.Cmdlet.ProcessRecordでは、System.Management.Automation.Cmdlet.WriteObject の呼び出しが、出力オブジェクトをパイプラインに送信するための出力メカニズムであることに注意してください。 この呼び出しの 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);
    }
  }
}
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 オブジェクトを使用してコマンドレット間で情報を渡します。 そのため、コマンドレットで独自の型を定義する必要がある場合や、別のコマンドレットによって提供される既存の型を拡張する必要がある場合があります。 新しい型の定義または既存の型の拡張の詳細については、「オブジェクト型の拡張と書式設定の」を参照してください。

コマンドレットのビルド

コマンドレットを実装したら、Windows PowerShell スナップインを使用して、コマンドレットを Windows PowerShell に登録する必要があります。 コマンドレットの登録の詳細については、「コマンドレット、プロバイダー、およびホスト アプリケーションを登録する方法」を参照してください。

コマンドレットのテスト

コマンドレットが Windows PowerShell に登録されている場合は、コマンド ラインで実行してテストできます。 サンプル コマンドレットのコードをテストする 2 つの方法を次に示します。 コマンド ラインからコマンドレットを使用する方法の詳細については、「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
    

こちらもご覧ください

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

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

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

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

Windows PowerShell リファレンス

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