パラメーターなしでコマンドレットを作成する
このセクションでは、パラメーターを使用せずにローカル コンピューターから情報を取得し、その情報をパイプラインに書き込むコマンドレットを作成する方法について説明します。 ここで説明するコマンドレットは、Get-Proc コンピューターのプロセスに関する情報を取得し、その情報をコマンド ラインで表示するコマンドレットです。
注意
コマンドレットを記述する場合、Windows PowerShell® 参照アセンブリはディスクにダウンロードされます (既定では C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0)。 グローバル アセンブリ キャッシュ (GAC) にはインストールされません。
コマンドレットに名前を付ける
コマンドレット名は、コマンドレットが実行するアクションを示す動詞と、コマンドレットが動作する項目を示す名詞で構成されます。 このサンプル Get-Proc コマンドレットはプロセス オブジェクトを取得するために 、System.Management.Automation.Verbscommon 列挙体で定義された動詞 "Get" と、コマンドレットがプロセス項目に対して動作する名詞 "Proc" を使用します。
コマンドレットに名前を付ける場合は、 # 、 () {} [] & - /\ $ ; : " '<> | ? @ ` .
名詞の選択
固有の名詞を選択する必要があります。 製品名の短縮バージョンでプレフィックスが付く単数名詞を使用するのが最善です。 この型のコマンドレット名の例は " " Get-SQLServer
です。
動詞の選択
承認されたコマンドレット動詞名のセットから動詞を使用する必要があります。 承認されたコマンドレット動詞の詳細については、「コマンドレット動詞名」 を参照してください。
コマンドレット クラスの定義
コマンドレット名を選択したら、コマンドレットを実装する .NET クラスを定義します。 このサンプル コマンドレットのクラス定義を次Get-Procします。
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
クラス定義より前のバージョンでは 、System.Management.Automation.CmdletAttribute 属性と 構文が使用されています。このクラスはコマンドレット [Cmdlet(verb, noun, ...)]
として識別されます。 これは、すべてのコマンドレットに必要な唯一の属性であり、ランタイムがWindows PowerShellを正しく呼び出すことができます。 属性キーワードを設定して、必要に応じてクラスをさらに宣言できます。 このサンプルの GetProcCommand クラスの属性宣言では、このコマンドレットの名詞と動詞の名前Get-Proc注意してください。
注意
すべての属性Windows PowerShell、設定できるキーワードは属性クラスのプロパティに対応します。
コマンドレットのクラスに名前を付ける場合は、クラス名にコマンドレット名を反映する方法が良い方法です。 これを行うには、"VerbNounCommand" という形式を使用し、"Verb" と "名詞" をコマンドレット名で使用される動詞と名詞に置き換える必要があります。 前のクラス定義に示すように、サンプル Get-Proc コマンドレットは 、System.Management.Automation.Cmdlet 基本クラスから派生する GetProcCommand という名前のクラスを定義します。
重要
Windows PowerShell ランタイムに直接アクセスするコマンドレットを定義する場合、.NET クラスはSystem.Management.Automation.PSCmdlet基本クラスから派生する必要があります。 このクラスの詳細については、「パラメーター セットを定義 するコマンドレットの作成」を参照してください。
注意
コマンドレットの クラスは、明示的に public としてマークする必要があります。 public としてマークされていないクラスは、既定で internal に設定され、ランタイムによってWindows PowerShellされません。
Windows PowerShellは、コマンドレットクラスに Microsoft.PowerShell.Commands名前空間を使用します。 コマンドレット クラスは、API 名前空間の Commands 名前空間 (xxx.PS.Commands など) に配置する必要があります。
入力処理メソッドのオーバーライド
System.Management.Automation.Cmdletクラスは、3 つの主要な入力処理メソッドを提供します。少なくとも 1 つは、コマンドレットでオーバーライドする必要があります。 レコードを処理する方法のWindows PowerShellについては、「 How Windows PowerShell Works 」を参照してください。
すべての種類の入力に対して、Windows PowerShellはSystem.Management.Automation.Cmdlet.BeginProcessingを呼び出して処理を有効にします。 コマンドレットで何らかの前処理またはセットアップを実行する必要がある場合は、このメソッドをオーバーライドすることでこれを行います。
注意
Windows PowerShell"record" という用語を使用して、コマンドレットの呼び出し時に指定されたパラメーター値のセットを記述します。
コマンドレットがパイプライン入力を受け入れる場合は 、System.Management.Automation.Cmdlet.ProcessRecord メソッドと、必要に応じて System.Management.Automation.Cmdlet.EndProcessing メソッドをオーバーライドする必要があります。 たとえば、 コマンドレットは、System.Management.Automation.Cmdlet.ProcessRecord を使用してすべての入力を収集し、コマンドレットと同様に一度に 1 つの要素ではなく、全体として入力を操作する場合、両方のメソッドをオーバーライド Sort-Object
できます。
コマンドレットがパイプライン入力を受け取らない場合は 、System.Management.Automation.Cmdlet.EndProcessing メソッドをオーバーライドする必要 があります。 このメソッドは、並べ替えコマンドレットの場合と同様に、コマンドレットが一度に 1 つの要素を操作できない場合に 、System.Management.Automation.Cmdlet.BeginProcessing の代用として頻繁に使用されます。
このサンプル Get-Proc コマンドレットはパイプライン入力を受け取る必要があります。このため 、System.Management.Automation.Cmdlet.ProcessRecord メソッドをオーバーライドし 、System.Management.Automation.Cmdlet.BeginProcessing および System.Management.Automation.Cmdlet.EndProcessingの既定の実装を使用します。 System.Management.Automation.Cmdlet.ProcessRecordオーバーライドは、System.Management.Automation.Cmdlet.WriteObjectメソッドを使用してプロセスを取得し、コマンド ラインに書き込みます。
protected override void ProcessRecord()
{
// Get the current processes
Process[] processes = Process.GetProcesses();
// Write the processes to the pipeline making them available
// to the next cmdlet. The second parameter of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()
'/ Get the current processes.
Dim processes As Process()
processes = Process.GetProcesses()
'/ Write the processes to the pipeline making them available
'/ to the next cmdlet. The second parameter of this call tells
'/ PowerShell to enumerate the array, and send one process at a
'/ time to the pipeline.
WriteObject(processes, True)
End Sub 'ProcessRecord
入力処理に関する注意
入力の既定のソースは、ユーザーがコマンド ラインで指定した明示的なオブジェクト (文字列など) です。 詳細については、「コマンド ライン入力 を処理するコマンドレットの作成」を参照してください。
入力処理メソッドは、パイプライン上のアップストリーム コマンドレットの出力オブジェクトから入力を受信することもできます。 詳細については、「パイプライン入力を 処理するコマンドレットの作成」を参照してください。 コマンドレットは、コマンド ラインソースとパイプライン ソースの組み合わせから入力を受け取る可能性があります。
ダウンストリーム コマンドレットが長時間返されないか、または返されない場合があります。 このため、コマンドレットの入力処理メソッドは 、System.Management.Automation.Cmdlet.WriteObjectの呼び出し中にロックを保持し 、特にスコープがコマンドレット インスタンスを超えて拡張されるロックを保持する必要があります。
重要
コマンドレットは 、System.Console.Writeline* またはそれに相当する を 呼び出さ "しない" 必要があります。
- コマンドレットには、処理の完了時にクリーンアップするオブジェクト変数がある場合があります (たとえば 、System.Management.Automation.Cmdlet.BeginProcessing メソッドでファイル ハンドルを開き 、System.Management.Automation.Cmdlet.ProcessRecordで使用するためにハンドルを開いた場所に保持している場合など)。 Windows PowerShell ランタイムは必ずしもSystem.Management.Automation.Cmdlet.EndProcessingメソッドを呼び出すとは限らないので、オブジェクトのクリーンアップを実行する必要があります。
たとえば、コマンドレットが途中で取り消された場合、またはコマンドレットの任意の部分で終了エラーが発生した場合 、System.Management.Automation.Cmdlet.EndProcessing が呼び出されない場合があります。 したがって、オブジェクトのクリーンアップを必要とするコマンドレットでは、ファイナライザーを含む完全な System.IDisposable パターンを実装して、ランタイムが処理の最後に System.Management.Automation.Cmdlet.EndProcessing と System.IDisposable.Dispose* の両方を呼び出す必要があります。
コード サンプル
完全な C# サンプル コードについては 、「GetProcessSample01 サンプル」を参照してください。
オブジェクト型と書式設定の定義
Windows PowerShell.NET オブジェクトを使用してコマンドレット間で情報を渡します。 そのため、コマンドレットで独自の型を定義する必要がある場合や、別のコマンドレットによって提供される既存の型を拡張する必要がある場合があります。 新しい型の定義または既存の型の拡張の詳細については、「オブジェクト型の拡張」および「書式設定」 を参照してください。
コマンドレットの構築
コマンドレットを実装した後、 スナップインを使用して、Windows PowerShellにWindows PowerShellする必要があります。 コマンドレットの登録の詳細については、「コマンドレット、プロバイダー、およびホスト アプリケーションを登録する方法」 を参照してください。
コマンドレットのテスト
コマンドレットが Windows PowerShellに登録されている場合は、コマンド ラインで実行してテストできます。 このサンプル Get-Proc コマンドレットのコードは小さいですが、引き続き Windows PowerShell ランタイムと既存の .NET オブジェクトを使用します。これは便利です。 このテストをテストして、実行できる機能Get-Procその出力の使い方を理解しましょう。 コマンド ラインからコマンドレットを使用する方法の詳細については、「 コマンド ラインを使用したはじめにをWindows PowerShell。
コンピューター Windows PowerShellを開始し、コンピューターで実行されている現在のプロセスを取得します。
get-proc
次のような出力が表示されます。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 33 0.03 3816 lg 27 2 560 1920 24 0.01 1768 TpScrex ...
操作を容易にするために、コマンドレットの結果に変数を割り当てる。
$p=get-proc
プロセスの数を取得します。
$p.length
次のような出力が表示されます。
63
特定のプロセスを取得します。
$p[6]
次のような出力が表示されます。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32
このプロセスの開始時刻を取得します。
$p[6].starttime
次のような出力が表示されます。
Tuesday, July 26, 2005 9:34:15 AM
$p[6].starttime.dayofyear
207
ハンドル数が 500 を超えるプロセスを取得し、結果を並べ替える。
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
次のような出力が表示されます。
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 440 393.56 3300 WINWORD 791 71 7412 4540 59 3.31 492 winlogon ...
コマンドレットを
Get-Member
使用して、各プロセスで使用できるプロパティを一覧表示します。$p | Get-Member -MemberType property
TypeName: System.Diagnostics.Process
次のような出力が表示されます。
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
参照
Windows PowerShell コマンドレットを作成する方法