PowerShell Cmdlet - Group-Object
 記事記号:[mg1902] 初版:2011/Sep/30

この文書は、Windows PowerShellのヘルプ機能で表示される内容を再構成したものです。

名前
    Group-Object
    
概要
    指定されたプロパティが同じ値を持つオブジェクトをグループ化します。
    
構文
    Group-Object [-AsHashTable] [-AsString] [[-Property] <Object[]>] [-CaseSensi
    tive] [-Culture <string>] [-InputObject <psobject>] [-NoElement] [<CommonPar
    ameters>]
    
説明
    Group-Object コマンドレットは、指定されたプロパティの値に基づいてオブジェク
    トをグループ化して表示します。Group-Object は、各行にそれぞれプロパティ値が
    含まれ、1 つの列にそのプロパティ値を持つ項目の数が含まれている 1 つの表を返
    します。
    
    複数のプロパティを指定した場合、Group-Object は、まず最初のプロパティの値で
    グループ化し、次に各プロパティ グループ内で次のプロパティの値でグループ化し
    ます。

パラメーター
    -AsHashTable [<SwitchParameter>]
        グループをハッシュ テーブルとして返します。ハッシュ テーブルのキーは、オ
        ブジェクトをグループ化する際に基準になるプロパティ値です。ハッシュ テー
        ブルの値は、そのプロパティ値を持つオブジェクトです。
        
        AsHashTable パラメーターを単独で使用すると、各キーがグループ化されたオブ
        ジェクトのインスタンスである各ハッシュ テーブルを返します。AsString パラ
        メーターと共に使用する場合は、ハッシュ テーブルのキーは文字列です。
        
        必須                         false
        位置                         named
        既定値                       GroupInfo オブジェクト
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false
        
    -AsString [<SwitchParameter>]
        ハッシュ テーブルのキーを文字列に変換します。既定では、ハッシュ テーブル
        のキーはグループ化されたオブジェクトのインスタンスです。このパラメーター
        は、AsHashTable パラメーターと共に使用した場合にのみ有効です。
        
        必須                         false
        位置                         named
        既定値                       GroupInfo オブジェクト
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false
        
    -CaseSensitive [<SwitchParameter>]
        グループ化する際に大文字と小文字が区別されます。このパラメーターを指定し
        ない場合、グループ内のオブジェクトのプロパティ値では大文字と小文字が区別
        されません。
        
        必須                         false
        位置                         named
        既定値                       
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false
        
    -Culture <string>
        文字列を比較する際に使用するカルチャを指定します。
        
        必須                         false
        位置                         named
        既定値                       
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false
        
    -InputObject <psobject>
        グループ化するオブジェクトを指定します。オブジェクトが格納されている変数
        を入力するか、オブジェクトを取得するコマンドまたは式を入力します。
        
        InputObject パラメーターを使用してオブジェクトのコレクションを Group-Obj
        ect に送ると、Group-Object はこのコレクションを表す 1 つのオブジェクトを
        受け取ります。その結果、そのオブジェクトがメンバーである 1 つのグループ
        が作成されます。
        
        コレクション内のオブジェクトをグループ化するには、Group-Object に対して
        オブジェクトをパイプ処理します。
        
        必須                         false
        位置                         named
        既定値                       
        パイプライン入力を許可する   true (ByValue)
        ワイルドカード文字を許可する false
        
    -NoElement [<SwitchParameter>]
        結果からグループのメンバーを除外します。
        
        必須                         false
        位置                         named
        既定値                       
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false
        
    -Property <Object[]>
        グループ化の基準になるプロパティを指定します。オブジェクトは、指定された
        プロパティの値に基づいてグループ化されます。
        
        Property パラメーターの値には、新しい集計プロパティを指定できます。集計
        プロパティを作成するには、文字列またはスクリプト ブロックの値を指定する 
        Expression キーでハッシュ テーブルを作成します。
        
        必須                         false
        位置                         1
        既定値                       
        パイプライン入力を許可する   false
        ワイルドカード文字を許可する false
        
    <CommonParameters>
        このコマンドレットは、次の共通パラメーターをサポートします: Verbose、
        Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、
        OutBuffer、および OutVariable。詳細については、
        「get-help about_commonparameters」と入力してヘルプを参照してください。
    
入力
    System.Management.Automation.PSObject
        パイプを使用してあらゆるオブジェクトを Group-Object に渡すことができます。
    
出力
    Microsoft.PowerShell.Commands.GroupInfo または System.Collections.Hashtable
        AsHashTable パラメーターを使用した場合、Group-Object はハッシュ テーブル
        を返します。それ以外の場合は、GroupInfo オブジェクトを返します。
    
メモ
        書式設定コマンドレット (Format-Table [m2]、Format-List [m2] など) の Gro
        upBy パラメーターを使用して、オブジェクトをグループ化することもできます。
        各行にそれぞれプロパティ値が含まれる 1 つの表を作成する Group-Object と
        は異なり、GroupBy パラメーターは、各行にそのプロパティ値を持つ項目がそれ
        ぞれ含まれている表をプロパティ値ごとに作成します。
        
        Group-Object の場合、グループ化されるオブジェクトが同じ Microsoft .NET F
        ramework 型である必要はありません。Group-Object は、以下のルールに従って
        異なる .NET Framework 型のオブジェクトをグループ化します。
        
        -- プロパティ名と型が同じ: オブジェクトに指定された名前のプロパティがあ
           り、プロパティ値の .NET Framework 型が同じ場合、プロパティ値は同じ型
           のオブジェクトと同じルールを使用してグループ化されます。
        
        -- プロパティ名は同じで、型が異なる: オブジェクトに指定された名前のプロ
           パティがあるが、オブジェクトによってプロパティ値の .NET Framework 型
           が異なる場合、Group-Object は最初のプロパティの .NET Framework 型をそ
           のプロパティ グループの .NET Framework 型として使用します。オブジェク
           トのプロパティの型が異なる場合、プロパティ値はそのグループの型に変換
           されます。型変換が失敗した場合、オブジェクトはそのグループから除外さ
           れます。
        
        -- プロパティがない: 指定されたプロパティがないオブジェクトは、グループ
           化できないと見なされます。グループ化できないオブジェクトは、最後の G
           roupInfo オブジェクト出力の AutomationNull.Value という名前のグルー
           プ内に表示されます。
        
    -------------------------- 例 1 --------------------------
    
    C:\PS>get-childitem *.doc | group-object -property length
    
    説明
    -----------
    このコマンドは、現在の場所にあるファイルの中で .doc 拡張子を持つファイルを取
    得し、そのサイズに基づいてグループ化します。
    
    -------------------------- 例 2 --------------------------
    
    C:\PS>get-childitem | sort-object -property extension | group-object -proper
    ty extension
    
    説明
    -----------
    このコマンドは、現在の場所にあるファイルを取得し、ファイル名拡張子ごとに並べ
    替えてグループ化します。ファイルは、グループ化される前に並べ替えられます。
    
    -------------------------- 例 3 --------------------------
    
    C:\PS>1..35 | group-object -property {$_ % 2},{$_ % 3}
    
    説明
    -----------
    この例は、スクリプト ブロックを Property パラメーターの値として使用する方法
    を示しています。
    
    このコマンドは、1 〜 35 の整数を 2 または 3 で除算した場合の剰余に基づいてグ
    ループ化して表示します。
    
    -------------------------- 例 4 --------------------------
    
    C:\PS>$events = get-eventlog -logname system -newest 1000 
    
    C:\PS> $events | group-object -property eventID 
    
    Count Name                      Group
    ----- ----                      -----
       44 Information               {System.Diagnostics.EventLogEntry,
        5 Error                     {System.Diagnostics.EventLogEntry,
        1 Warning                   {System.Diagnostics.EventLogEntry}
    
    説明
    -----------
    これらのコマンドは、システム イベント ログの最新の 1,000 エントリを EventID 
    に基づいてグループ化して表示します。
    
    最初のコマンドは、Get-EventLog コマンドレットを使用してイベントを取得し、代
    入演算子 (=) を使用して $events 変数に保存します。
    
    2 番目のコマンドは、パイプライン演算子 (|) を使用して、$events 変数に保存さ
    れているイベントを Group-Object コマンドレットに送ります。また、Property パ
    ラメーターを使用して、EventID プロパティの値に基づいてイベントをグループ化
    するように指定します。
    
    出力の Count 列は各グループのエントリの数、Name 列はグループを定義する Event
    ID 値、および Group 列は各グループ内のオブジェクトを表します。
    
    -------------------------- 例 5 --------------------------
    
    C:\PS>get-process | group-object -property priorityclass
    
    Count Name                Group
    ----- ----                -----
       55 Normal              {System.Diagnostics.Process (AdtAgent), System.Dia
                              gnostics.Process (alg), System.Dia...
        1                     {System.Diagnostics.Process (Idle)}
        3 High                {System.Diagnostics.Process (Newproc), System.Diag
                              nostics.Process (winlogon), System.D...
        2 BelowNormal         {System.Diagnostics.Process (winperf),  
    
    C:\PS>get-process | group-object -property company -noelement
    Count Name
    ----- ----
       55 Normal
        1
        3 High
        2 BelowNormal
    
    説明
    -----------
    この例で、NoElement パラメーターの結果を説明します。これらのコマンドは、コン
    ピューター上のプロセスを優先度クラスごとにグループ化します。
    
    最初のコマンドは、Get-Process コマンドレットを使用してコンピューター上のプロ
    セスを取得します。また、パイプライン演算子 (|) を使用して結果を Group-Object 
    に送ります。このコマンドレットは、プロセスの PriorityClass プロパティの値に
    基づいてオブジェクトをグループ化します。
    
    2 番目のコマンドは最初のコマンドと同じですが、NoElement パラメーターを使用し
    て出力からグループのメンバーを取り除く点が異なります。結果は数とプロパティ値
    の名前のみを含む表です。
    
    次のサンプル出力に結果を示します。
    
    -------------------------- 例 6 --------------------------
    
    C:\PS>get-eventlog -logname system -newest 1000 | group-object -property {$_
    .TimeWritten - $_.TimeGenerated}
    
    説明
    -----------
    このコマンドは、スクリプト ブロックとして Property パラメーターの値を指定す
    る方法を示しています。
    
    このコマンドは、システム イベント ログの最新の 1,000 エントリを、生成されて
    からログに書き込まれるまでの時間に基づいてグループ化し、表示します。
    
    このコマンドは、Get-EventLog コマンドレットを使用して、イベント ログ エント
    リを取得します。また、パイプライン演算子 (|) を使用して、エントリを Group-Ob
    ject コマンドレットに送信します。Property パラメーターの値は、スクリプト ブ
    ロック (かっこ内の式) として指定されています。スクリプト ブロックの評価結果
    は、ログ エントリが生成されてからログに書き込まれるまでの時間になります。そ
    の値を使用して、最新のイベント 1000 個がグループ化されます。
    
    -------------------------- 例 7 --------------------------
    
    C:\PS>get-childitem | group-object extension -noelement 
    
    Count Name
    ----- ----
       21
       82 .txt
        9 .cmd
        5 .log
       12 .xml
        5 .htm
       36 .ps1
        1 .psc1
        3 .exe
        6 .csv
        1 .psd1
        2 .bat
    
    説明
    -----------
    このコマンドは、現在のディレクトリにある項目をファイル名拡張子に基づいてグル
    ープ化します。NoElement パラメーターを使用してグループのメンバーを除外します。
    
    次のサンプル出力に結果を示します。
    
    -------------------------- 例 8 --------------------------
    
    C:\PS>"a", "b", "c", "c", "d" | get-unique
    
    a
    b
    c
    d
    
    C:\PS> "a", "b", "c", "c", "d" | group-object -noelement | where {$_.Count -
    gt 1}
    Count Name
    ----- ----
        2 c
    
    C:\PS> get-process | group-object -property Name -noelement | where {$_.coun
    t -gt 1}
    Count Name
    ----- ----
        2 csrss
        5 svchost
        2 winlogon
        2 wmiprvse
    
    説明
    -----------
    この例は、コレクション内の一意のプロパティまたは一意でないプロパティ (繰り返
    しプロパティ) の値を調べる方法を示しています。
    
    最初のコマンドは、Get-Unique コマンドレットに対して配列をパイプ処理して、配
    列の一意の要素を取得します。
    
    2 番目のコマンドは配列の一意でない要素を取得します。また、Group-Object コマ
    ンドレットに対して配列をパイプ処理します。このコマンドレットは、値に基づいて
    オブジェクトをグループ化します。作成されたグループは、Where-Object コマンド
    レットに対してパイプ処理されます。このコマンドレットは、複数のメンバーを持つ
    グループでオブジェクトを選択します。
    
    3 番目のコマンドはこの方法を実際に使用した例を示しています。同じメソッドを使
    用して、プロセス名が同じコンピューター上でプロセスを調べます。
    
    次のサンプル出力に結果を示します。
    
    -------------------------- 例 9 --------------------------
    
    C:\PS>$a = get-command get-*, set-* -type cmdlet | group-object -property ve
    rb -ashashtable -asstring
    
    C:\PS> $a 
    
    Name    Value
    ----    -----
    Get     {Get-PSCallStack, Get-PSBreakpoint, Get-PSDrive, Get-PSSession...}
    Set     {Set-Service, Set-StrictMode, Set-PSDebug, Set-PSSessionConfigurati
            on...}
    
    C:\PS> $a.get
    
    CommandType     Name                 Definition
    -----------     ----                 ----------
    Cmdlet          Get-PSCallStack      Get-PSCallStack [-Verbose] [-Debug] [-
                                         ErrorAction <ActionPrefer...
    Cmdlet          Get-PSBreakpoint     Get-PSBreakpoint [[-Id] <Int32[]>] [-V
                                         erbose] [-Debug] [-ErrorA...
    Cmdlet          Get-PSDrive          Get-PSDrive [[-Name] <String[]>] [-Sco
                                         pe <String>] [-PSProvider...
    ...
    
    説明
    -----------
    この例では、AsHashTable パラメーターと AsString パラメーターを使用して、グル
    ープをハッシュ テーブルで、つまりキーと値のペアのコレクションとして返します。
    
    結果のハッシュ テーブルでは、各プロパティ値がキーで、グループ要素が値です。
    各キーがハッシュ テーブル オブジェクトのプロパティであるため、ドット表記を使
    用して値を表示できます。
    
    最初のコマンドは、セッション内の Get コマンドレットと Set コマンドレットを取
    得し、動詞に基づいてグループ化し、グループをハッシュ テーブルとして返し、$a 
    変数に保存します。
    
    2 番目のコマンドは、$a 変数に保存されたハッシュ テーブルを表示します。Get コ
    マンドレットと Set コマンドレットの 2 つのキーと値のペアが存在します。
    
    3 番目のコマンドは、ドット表記を使用して、$a に保存された Get キーの値を表示
    します。値は CmdletInfo オブジェクトです。AsString パラメーターはグループ内
    のオブジェクトを文字列に変換しません。
    
関連するリンク
    Online version: http://go.microsoft.com/fwlink/?LinkID=113338
    	
記事で解説しているパソコンの環境
 基本ソフト: Windows 7
 キーワード: Windows PowerShell、ヘルプ、Cmdlet、Group-Object
ご利用数: 1975157
感想・要望・問い合わせは こちら