コマンドライン入力を処理するパラメーターを追加する
コマンドレットの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 process オブジェクトの名前を表します。 このため、コマンドレットクラスは、名前の配列を受け入れる文字列型のプロパティを定義します。
コマンドレットのパラメーターのパラメーター宣言を次に示し Name
Get-Proc
ます。
/// <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
このプロパティがパラメーターであることを Windows PowerShell ランタイムに通知するには、 Name
プロパティ定義にsystem.string 属性を追加します。 この属性を宣言するための基本構文は [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
position を使用してパラメーターを位置指定パラメーターとして定義します。
0. これは、ユーザーがコマンドラインに入力した最初の引数が、このパラメーターに自動的に挿入されることを意味します。 ユーザーがコマンドラインからパラメーター名を指定する必要のある名前付きパラメーターを定義する場合は、 Position
キーワードを属性宣言の外に残します。
注意
パラメーターの名前を指定する必要がない限り、最も使用されているパラメーターを設定して、ユーザーがパラメーター名を入力する必要がないようにすることをお勧めします。
必須またはオプションとしてのパラメーターの宣言
コマンドレットでは、各パラメーターを省略可能なパラメーターまたは必須パラメーターのいずれかとして設定する必要があります。 このサンプルコマンドレットでは、 Get-Proc
Name
キーワードが Mandatory
属性宣言で設定されていないため、パラメーターはオプションとして定義されます。
パラメーター検証のサポート
サンプル Get-Proc
コマンドレット は、入力検証属性である system.string をパラメーターに追加して、 Name
入力がでも空でもないことを検証できるようにします null
。 この属性は、Windows PowerShell によって提供されるいくつかの検証属性の1つです。 その他の検証属性の例については、「 パラメーター入力の検証」を参照してください。
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name
入力処理メソッドのオーバーライド
コマンドレットがコマンドライン入力を処理する場合は、適切な入力処理メソッドをオーバーライドする必要があります。 基本的な入力処理方法は、 最初のコマンドレットを作成するときに導入されます。
Get-Proc
コマンドレットは、 Name
ユーザーまたはスクリプトによって指定されたパラメーター入力を処理するために、system.object メソッドをオーバーライドします。 このメソッドは、要求された各プロセス名のプロセスを取得します。名前が指定されていない場合は、すべてのプロセスを取得します。 WriteObject% 2csystem.string %29の呼び出しは、出力オブジェクトをパイプラインに送信するための出力機構として使用されていることに注意してください。........................ processrecord. この呼び出しの2番目のパラメーターで enumerateCollection
あるは、をに設定して、 true
プロセスオブジェクトの出力配列を列挙し、一度に1つのプロセスをコマンドラインに書き込むように Windows PowerShell ランタイムに通知します。
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 sample」を参照してください。
オブジェクトの種類と書式設定の定義
Windows PowerShell は .NET Framework オブジェクトを使用してコマンドレット間で情報を渡します。 そのため、コマンドレットで独自の型を定義する必要がある場合や、コマンドレットで別のコマンドレットによって提供される既存の型を拡張する必要がある場合があります。 新しい型を定義する、または既存の型を拡張する方法の詳細については、「 オブジェクトの型と書式設定の拡張」を参照してください。
コマンドレットのビルド
コマンドレットを実装したら、Windows PowerShell スナップインを使用して Windows PowerShell に登録する必要があります。 コマンドレットの登録の詳細については、「 コマンドレット、プロバイダー、およびホストアプリケーションを登録する方法」を参照してください。
コマンドレットのテスト
コマンドレットが Windows PowerShell に登録されている場合は、コマンドラインで実行することでテストできます。 サンプルコマンドレットのコードをテストするには、次の2つの方法があります。 コマンドラインからコマンドレットを使用する方法の詳細については、「 Windows PowerShell でのはじめに」を参照してください。
Windows PowerShell プロンプトで、次のコマンドを使用して、"iexplore.exe" という名前の 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
Internet Explorer、Outlook、および "iexplore.exe"、"Outlook"、および "Notepad" という名前のメモ帳プロセスを一覧表示するには、次のコマンドを使用します。 複数のプロセスがある場合は、すべてのプロセスが表示されます。
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