コマンドレットの入力ソースの 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-Proc
と Get-Member
はパイプライン化されたコマンドレットの名前であり、MemberType
は Get-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 では、一貫性のあるユーザー エクスペリエンスを提供するために、いくつかのパラメーター名が予約されています。
WhatIf
、Confirm
、Verbose
、Debug
、Warn
、ErrorAction
、ErrorVariable
、OutVariable
、およびOutBuffer
のパラメーター名は使用しないでください。 さらに、これらのパラメーター名には、vb
、db
、ea
、ev
、ov
、および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
こちらもご覧ください
パイプライン入力 を処理するパラメーターの追加の
最初のコマンドレット を作成する
オブジェクト型の拡張と書式設定 の
PowerShell