次の方法で共有


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

このセクションでは、パラメーターを使用せずにローカル コンピューターから情報を取得し、その情報をパイプラインに書き込むコマンドレットを作成する方法について説明します。 ここで説明するコマンドレットは、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.EndProcessing が呼び出されない場合があります。 したがって、オブジェクトのクリーンアップを必要とするコマンドレットでは、ファイナライザーを含む完全な System.IDisposable パターンを実装して、ランタイムが処理の最後に System.Management.Automation.Cmdlet.EndProcessingSystem.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 リファレンス

コマンドレット サンプル