コマンドレットにパラメーター セットを追加する

パラメーター セットに関する情報

Windows PowerShell、一緒に動作するパラメーターのグループとしてパラメーター セットを定義します。 コマンドレットのパラメーターをグループ化することで、ユーザーが指定するパラメーターのグループに基づいて機能を変更できる単一のコマンドレットを作成できます。

2 つのパラメーター セットを使用して異なる機能を定義するコマンドレットの例として、2 つのパラメーター セットによって提供 Get-EventLog されるコマンドレットWindows PowerShell。 このコマンドレットは、ユーザーが パラメーターまたは パラメーターを指定すると、異なる情報 List を返 LogName します。 パラメーターが LogName 指定されている場合、コマンドレットは、特定のイベント ログ内のイベントに関する情報を返します。 パラメーターを指定した場合、コマンドレットはログ ファイル自体に関する情報を返します (ログ ファイルに含 List まれるイベント情報ではありません)。 この場合、 パラメーターと パラメーター ListLogName 、2 つの個別のパラメーター セットを識別します。

パラメーター セットについて覚えておく必要がある 2 つの重要な点は、Windows PowerShell ランタイムが特定の入力に対して 1 つのパラメーター セットのみを使用し、各パラメーター セットには、そのパラメーター セットに対して一意のパラメーターが少なくとも 1 つ必要である点です。

最後のポイントを示す場合、このコマンドレットStop-Proc、、および の 3 ProcessName つのパラメーター セット ProcessId を使用します InputObject 。 これらの各パラメーター セットには、他のパラメーター セットに含されていない 1 つのパラメーターがあります。 パラメーター セットは他のパラメーターを共有できますが、コマンドレットでは、一意のパラメーター 、、および を使用して、ランタイムで使用する必要があるパラメーターのWindows PowerShell ProcessName ProcessId InputObject 識別します。

コマンドレット クラスの宣言

コマンドレットの作成の最初の手順は、常にコマンドレットに名前を付け、コマンドレットを実装する .NET クラスを宣言します。 このコマンドレットでは、コマンドレットがシステム プロセスを停止するために、ライフサイクル動詞 "Stop" が使用されます。 コマンドレットがプロセスで動作するために、名詞名 "Proc" が使用されます。 次の宣言では、コマンドレット動詞と名詞名がコマンドレット クラスの名前に反映されます。

注意

承認されたコマンドレット動詞名の詳細については、「コマンドレット動詞名 」を参照してください

次のコードは、このコマンドレットのクラスStop-Procです。

[Cmdlet(VerbsLifecycle.Stop, "Proc",
        DefaultParameterSetName = "ProcessId",
        SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
    Inherits PSCmdlet

コマンドレットのパラメーターの宣言

このコマンドレットは、コマンドレットへの入力として必要な 3 つのパラメーター (これらのパラメーターではパラメーター セットも定義します) と、コマンドレットが実行する処理を管理するパラメーターと、コマンドレットがパイプラインを介して出力オブジェクトを送信するかどうかを決定するパラメーターを定義します。 Force PassThru 既定では、このコマンドレットはパイプラインを介してオブジェクトを渡すのではありません。 これらの最後の 2 つのパラメーターの詳細については、「システムを変更 するコマンドレットの作成」を参照してください

Name パラメーターの宣言

この入力パラメーターを使用すると、ユーザーは停止するプロセスの名前を指定できます。 ParameterSetName System.Management.Automation.Parameterattribute属性の attribute キーワードは、このパラメーターに設定 ProcessName されたパラメーターを指定します。

[Parameter(
   Position = 0,
   ParameterSetName = "ProcessName",
   Mandatory = true,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true,
   HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
    get { return processNames; }
    set { processNames = value; }
}
private string[] processNames;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
    "Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
    Get
        Return processNames
    End Get
    Set(ByVal value As String())
        processNames = value
    End Set
End Property

Private processNames() As String

別名 "ProcessName" がこのパラメーターに指定されている点にも注意してください。

Id パラメーターの宣言

この入力パラメーターを使用すると、ユーザーは停止するプロセスの識別子を指定できます。 ParameterSetName System.Management.Automation.Parameterattribute属性の attribute キーワードは、パラメーター セットを ProcessId 指定します。

[Parameter(
           ParameterSetName = "ProcessId",
           Mandatory = true,
           ValueFromPipelineByPropertyName = true,
           ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
  get { return processIds; }
  set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
    Get
        Return processIds
    End Get
    Set(ByVal value As Integer())
        processIds = value
    End Set
End Property
Private processIds() As Integer

このパラメーターには別名 "ProcessId" が指定されています。

InputObject パラメーターの宣言

この入力パラメーターを使用すると、ユーザーは、停止するプロセスに関する情報を含む入力オブジェクトを指定できます。 ParameterSetName System.Management.Automation.Parameterattribute属性の attribute キーワードは、このパラメーターに設定 InputObject されたパラメーターを指定します。

[Parameter(
           ParameterSetName = "InputObject",
           Mandatory = true,
           ValueFromPipeline = true)]
public Process[] InputObject
{
  get { return inputObject; }
  set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
    Get
        Return myInputObject
    End Get
    Set(ByVal value As Process())
        myInputObject = value
    End Set
End Property
Private myInputObject() As Process

このパラメーターにはエイリアスがない点にも注意してください。

複数のパラメーター セットでのパラメーターの宣言

パラメーター セットごとに一意のパラメーターが必要ですが、パラメーターは複数のパラメーター セットに属することができます。 このような場合は、パラメーターが属するセットごとに、共有パラメーターに System.Management.Automation.Parameterattribute 属性宣言を指定します。 パラメーターがすべてのパラメーター セット内にある場合は、パラメーター属性を 1 回だけ宣言する必要があります。パラメーター セット名を指定する必要はない。

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

すべてのコマンドレットは入力処理メソッドをオーバーライドする必要があります。ほとんどの場合、 これは System.Management.Automation.Cmdlet.ProcessRecord メソッド になります。 このコマンドレットでは、コマンドレットが任意の数のプロセスを処理できるよう 、System.Management.Automation.Cmdlet.ProcessRecord メソッドがオーバーライドされます。 ユーザーが指定したパラメーター セットに基づいて別のメソッドを呼び出す Select ステートメントが含まれている。

protected override void ProcessRecord()
{
  switch (ParameterSetName)
  {
    case "ProcessName":
         ProcessByName();
         break;

    case "ProcessId":
         ProcessById();
         break;

    case "InputObject":
         foreach (Process process in inputObject)
         {
           SafeStopProcess(process);
         }
         break;

    default:
         throw new ArgumentException("Bad ParameterSet Name");
  } // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
    Select Case ParameterSetName
        Case "ProcessName"
            ProcessByName()

        Case "ProcessId"
            ProcessById()

        Case "InputObject"
            Dim process As Process
            For Each process In myInputObject
                SafeStopProcess(process)
            Next process

        Case Else
            Throw New ArgumentException("Bad ParameterSet Name")
    End Select

End Sub 'ProcessRecord ' ProcessRecord

ここでは、Select ステートメントによって呼び出されるヘルパー メソッドについて説明しますが、次のセクションの完全なコード サンプルで実装を確認できます。

コード サンプル

完全な C# サンプル コードについては 、「StopProcessSample04 サンプル」を参照してください

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

Windows PowerShell.NET オブジェクトを使用してコマンドレット間で情報を渡します。 そのため、コマンドレットで独自の型を定義する必要がある場合や、別のコマンドレットによって提供される既存の型を拡張する必要がある場合があります。 新しい型の定義または既存の型の拡張の詳細については、「オブジェクト型の拡張」および「書式設定」 を参照してください

コマンドレットの構築

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

コマンドレットのテスト

コマンドレットが Windows PowerShellに登録されている場合は、コマンド ラインで実行してテストします。 パラメーター セットをテストしてプロセスを停止するために パラメーターと パラメーターを使用する方法を示 ProcessId InputObject すテストを次に示します。

  • 開始Windows PowerShell、パラメーターを設定して Stop-Proc コマンドレットを実行し、その識別子に基づいて ProcessId プロセスを停止します。 この場合、コマンドレットは パラメーター セットを ProcessId 使用してプロセスを停止します。

    PS> stop-proc -Id 444
    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    
  • 開始Windows PowerShell、パラメーターを設定して Stop-Proc コマンドレットを実行し、コマンドによって取得された メモ帳 オブジェクトのプロセス InputObject を停止 Get-Process します。

    PS> get-process notepad | stop-proc
    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    

参照

システムを変更するコマンドレットを作成する

Windows PowerShell コマンドレットを作成する方法

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

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

Windows PowerShell SDK