次の方法で共有


パラメーターなしでコマンドレットを作成する

このセクションでは、パラメーターを使用せずにローカル コンピューターから情報を取得し、その情報をパイプラインに書き込むコマンドレットを作成する方法について説明します。 ここで説明するコマンドレットは、ローカル コンピューターのプロセスに関する情報を取得し、その情報をコマンド ラインに表示する 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.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 の概要」を参照してください。

  1. 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
    ...
    
  2. 操作を容易にするために、コマンドレットの結果に変数を割り当てます。

    $p=Get-Proc
    
  3. プロセスの数を取得します。

    $p.Length
    

    次の出力が表示されます。

    63
    
  4. 特定のプロセスを取得します。

    $p[6]
    

    次の出力が表示されます。

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. このプロセスの開始時刻を取得します。

    $p[6].StartTime
    

    次の出力が表示されます。

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].StartTime.DayOfYear
    
    207
    
  6. ハンドル数が 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
    ...
    
  7. 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 コマンドレットを作成する方法

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

Windows PowerShell のしくみ

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

Windows PowerShell リファレンス

コマンドレットのサンプル