このセクションでは、パラメーターを使用せずにローカル コンピューターから情報を取得し、その情報をパイプラインに書き込むコマンドレットを作成する方法について説明します。 ここで説明するコマンドレットは、ローカル コンピューターのプロセスに関する情報を取得し、その情報をコマンド ラインに表示する 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
クラス定義の前に、構文 [Cmdlet(verb, noun, ...)]
System.Management.Automation.CmdletAttribute 属性を使用して、このクラスをコマンドレットとして識別していることに注意してください。 これはすべてのコマンドレットに必要な唯一の属性であり、Windows PowerShell ランタイムがそれらを正しく呼び出すことができます。 属性キーワードを設定して、必要に応じてクラスをさらに宣言できます。 サンプルの GetProcCommand クラスの属性宣言では、Get-Proc コマンドレットの名詞と動詞の名前のみが宣言されることに注意してください。
注
すべての Windows PowerShell 属性クラスについて、設定できるキーワードは属性クラスのプロパティに対応します。
コマンドレットのクラスに名前を付ける場合は、コマンドレット名をクラス名に反映することをお勧めします。 これを行うには、"VerbNounCommand" という形式を使用し、"Verb" と "Noun" をコマンドレット名で使用される動詞と名詞に置き換えます。 前のクラス定義に示すように、サンプル Get-Proc コマンドレットは GetProcCommand というクラスを定義します。これは、System.Management.Automation.Cmdlet 基底クラスから派生します。
重要
Windows PowerShell ランタイムに直接アクセスするコマンドレットを定義する場合、.NET クラスは基本クラス System.Management.Automation.PSCmdlet から派生する必要があります。 このクラスの詳細については、「パラメーター セットを定義するコマンドレットの作成」を参照してください。
注
コマンドレットのクラスは、明示的にパブリックとしてマークする必要があります。 パブリックとしてマークされていないクラスは、既定で内部クラスになり、Windows PowerShell ランタイムでは見つかりません。
Windows PowerShell では、コマンドレット クラスに Microsoft.PowerShell.Commands 名前空間が使用されます。 xxx.PS など、API 名前空間の Commands 名前空間にコマンドレット クラスを配置することをお勧めします。コマンド。
入力処理メソッドのオーバーライド
System.Management.Automation.Cmdlet クラスには、3 つの主要な入力処理メソッドが用意されています。そのうち少なくとも 1 つは、コマンドレットをオーバーライドする必要があります。 Windows PowerShell がレコードを処理する方法の詳細については、「Windows PowerShell のしくみ」を参照してください。
すべての種類の入力について、Windows PowerShell ランタイムは System.Management.Automation.Cmdlet.BeginProcessing 呼び出して処理を有効にします。 コマンドレットで何らかの前処理またはセットアップを実行する必要がある場合は、このメソッドをオーバーライドすることでこれを行うことができます。
注
Windows PowerShell では、"record" という用語を使用して、コマンドレットの呼び出し時に指定されるパラメーター値のセットを記述します。
コマンドレットがパイプライン入力を受け入れる場合は、System.Management.Automation.Cmdlet.ProcessRecord メソッド、および必要に応じて System.Management.Automation.Cmdlet.EndProcessing メソッドをオーバーライドする必要があります。 たとえば、Sort-Object
コマンドレットのように、System.Management.Automation.Cmdlet.ProcessRecord を使用してすべての入力を収集し、一度に 1 つの要素ではなく全体で操作する場合、コマンドレットは両方のメソッドをオーバーライドできます。
コマンドレットがパイプライン入力を受け取らない場合は、System.Management.Automation.Cmdlet.EndProcessing メソッドをオーバーライドする必要があります。 このメソッドは、System.Management.Automation.Cmdlet.BeginProcessing の代わりに頻繁に使用されます。これは、並べ替えコマンドレットの場合と同様に、コマンドレットが一度に 1 つの要素を操作できない場合です。
このサンプル 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 コマンドレットを作成する方法
オブジェクト型の拡張と書式設定 の
PowerShell