共用方式為


Group-Object

將包含指定屬性之相同值的物件分組。

Syntax

Group-Object
     [-NoElement]
     [-AsHashTable]
     [-AsString]
     [-InputObject <PSObject>]
     [[-Property] <Object[]>]
     [-Culture <String>]
     [-CaseSensitive]
     [<CommonParameters>]

Description

Cmdlet 會 Group-Object 根據指定屬性的值,在群組中顯示物件。 Group-Object 會針對每個屬性值傳回一個數據列的數據表,以及顯示具有該值之項目數的數據行。

如果您指定多個屬性, Group-Object 請先依第一個屬性的值加以分組,然後在每個屬性群組中,依下一個屬性的值分組。

從 PowerShell 7 開始, Group-Object 可以結合 CaseSensitiveAsHashtable 參數來建立區分大小寫的哈希表。 哈希表索引鍵會使用區分大小寫的比較,並輸出 System.Collections.Hashtable 物件。

範例

範例 1:依擴展名分組檔案

這個範例會以遞歸方式取得下的 $PSHOME 檔案,並依擴展名將它們分組。 輸出會傳送至 Sort-Object Cmdlet,其會依指定延伸模組找到的計數檔案排序。 空 的 Name 代表目錄。

這個範例會使用 NoElement 參數來省略群組的成員。

$files = Get-ChildItem -Path $PSHOME -Recurse
$files |
    Group-Object -Property extension -NoElement |
    Sort-Object -Property Count -Descending

Count Name
----- ----
  365 .xml
  231 .cdxml
  197
  169 .ps1xml
  142 .txt
  114 .psd1
   63 .psm1
   49 .xsd
   36 .dll
   15 .mfl
   15 .mof
...

範例 2:以奇數和偶數分組整數

此範例示範如何使用腳本區塊做為 Property 參數的值。 此命令會顯示從 1 到 20 的整數,並以奇數和偶數分組。

1..20 | Group-Object -Property {$_ % 2}

Count Name                      Group
----- ----                      -----
   10 0                         {2, 4, 6, 8...}
   10 1                         {1, 3, 5, 7...}

範例 3:依索引鍵值群組哈希表

從 PowerShell 6 開始, Group-Object 支援依索引鍵值排序 哈希表 輸入。 下列範例會依每個哈希表索引 weight 鍵的值,將哈希表的陣列分組。

這個範例會使用 NoElement 參數來省略群組的成員。

@(
    @{ name = 'a' ; weight = 7 }
    @{ name = 'b' ; weight = 1 }
    @{ name = 'c' ; weight = 3 }
    @{ name = 'd' ; weight = 7 }
) | Group-Object -Property weight -NoElement

Count Name
----- ----
    1 1
    1 3
    2 7

範例 4:依 EntryType 分組事件記錄檔事件

此範例會在 System 事件記錄檔中顯示 1,000 個最新的專案,並依 EntryType 分組。

在輸出中, Count 資料 行代表每個群組中的項目數目。 Name 數據行代表定義群組的 EventType 值。 [ 群組 ] 數據行代表每個群組中的物件。

Get-WinEvent -LogName System -MaxEvents 1000 | Group-Object -Property LevelDisplayName

Count Name          Group
----- ----          -----
  153 Error         {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
  722 Information   {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
  125 Warning       {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}

範例 5:依優先順序類別分組進程

此範例示範 NoElement 參數的效果。 這些命令會依優先順序類別將電腦上的處理程序分組。

第一個命令會 Get-Process 使用 Cmdlet 來取得電腦上的進程,並將對象傳送至管線。 Group-Object依進程的 PriorityClass 屬性值,將物件分組。

第二個範例會使用 NoElement 參數,從輸出中移除群組的成員。 結果是只有 CountName 屬性值的數據表。

結果顯示在下列範例輸出中。

Get-Process | Group-Object -Property PriorityClass

Count Name         Group
----- ----         -----
   55 Normal       {System.Diagnostics.Process (AdtAgent), System.Diagnosti...
    1              {System.Diagnostics.Process (Idle)}
    3 High         {System.Diagnostics.Process (Newproc), System.Diagnostic...
    2 BelowNormal  {System.Diagnostics.Process (winperf),

Get-Process | Group-Object -Property PriorityClass -NoElement

Count Name
----- ----
   55 Normal
    1
    3 High
    2 BelowNormal

範例 6:依名稱分組進程

下列範例會使用 Group-Object 來群組在本機計算機上執行的多個進程實例。 Where-Object 顯示具有多個實例的進程。

Get-Process | Group-Object -Property Name -NoElement | Where-Object {$_.Count -gt 1}

Count Name
----- ----
2     csrss
5     svchost
2     winlogon
2     wmiprvse

範例 7:群組哈希表中的物件

這個範例會使用 AsHashTableAsString 參數傳回哈希表中的群組,做為索引鍵/值組的集合。

在產生的雜湊表中,每個屬性值為索引鍵,而群組元素為值。 因為每個索引鍵是雜湊表物件的屬性,您可以使用點標記法來顯示值。

第一個命令會取得 Get 會話中的 和 Set Cmdlet、依動詞分組、將群組傳回為哈希表,並將哈希表儲存在變數中 $A

第二個命令會顯示 中的 $A哈希表。 有兩個索引鍵/值組,一個用於 Get Cmdlet,另一個用於 Set Cmdlet。

第三個命令會使用點表示法,$A.Get在 中$A顯示 Get 索引鍵的值。 這些值為 CmdletInfo 物件。 AsString 參數不會將群組中的物件轉換成字串。

$A = Get-Command Get-*, Set-* -CommandType cmdlet |
     Group-Object -Property Verb -AsHashTable -AsString
$A

Name     Value
----     -----
Get      {Get-Acl, Get-Alias, Get-AppLockerFileInformation, Get-AppLockerPolicy...}
Set      {Set-Acl, Set-Alias, Set-AppBackgroundTaskResourcePolicy, Set-AppLockerPolicy...}

$A.Get

CommandType     Name                              Version    Source
-----------     ----                              -------    ------
Cmdlet          Get-Acl                           7.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Get-Alias                         7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-AppLockerFileInformation      2.0.0.0    AppLocker
Cmdlet          Get-AppLockerPolicy               2.0.0.0    AppLocker
...

範例 8:Create 區分大小寫的哈希表

此範例結合了 CaseSensitiveAsHashTable 參數,以建立區分大小寫的哈希表。 範例中的檔案具有和.TXT.txt擴展名。

$hash = Get-ChildItem -Path C:\Files |
        Group-Object -Property Extension -CaseSensitive -AsHashTable
$hash

Name           Value
----           -----
.TXT           {C:\Files\File7.TXT, C:\Files\File8.TXT, C:\Files\File9.TXT}
.txt           {C:\Files\file1.txt, C:\Files\file2.txt, C:\Files\file3.txt}

變數 $hash 會儲存 System.Collections.Hashtable 物件。 Get-ChildItem 會從 C:\Files 目錄取得檔名,並將 System.IO.FileInfo 物件傳送至管線。 Group-Object 使用 Property value Extension 將物件分組。 CaseSensitiveAsHashTable 參數會建立哈希表,且索引鍵會使用區分大小寫的索引鍵.txt.TXT分組。

參數

-AsHashTable

表示這個 Cmdlet 會將群組傳回為哈希表。 雜湊表的索引鍵為屬性值,會以其為依據進行物件分組。 雜湊表的值是具有該屬性值的物件。

AsHashTable 參數本身會傳回每個哈希表,其中每個索引鍵都是群組對象的實例。 搭配 AsString 參數使用時,哈希表中的索引鍵是字串。

從 PowerShell 7 開始,若要建立區分大小寫的哈希表,請在命令中包含 CaseSensitiveAsHashtable

Type:SwitchParameter
Aliases:AHT
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-AsString

表示這個 Cmdlet 會將哈希表索引鍵轉換成字串。 依預設,雜湊表索引鍵是群組物件的執行個體。 此參數只有在與 AsHashTable 參數搭配使用時才有效。

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CaseSensitive

表示此 Cmdlet 會使群組區分大小寫。 如果沒有這個參數,群組中物件的屬性值可能大小寫會有不同。

從 PowerShell 7 開始,若要建立區分大小寫的哈希表,請在命令中包含 CaseSensitiveAsHashtable

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

指定比較字串時要使用的文化特性。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定要分組的物件。 輸入包含物件的變數,或輸入可取得物件的命令或運算式。

當您使用 InputObject 參數將物件的集合提交至 Group-Object時, Group-Object 會收到一個代表集合的物件。 如此一來,它會建立該物件做為其成員的單一群組。

若要將集合中的物件群組,請使用管線將 物件傳送至 Group-Object

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-NoElement

表示此 Cmdlet 會省略結果中群組的成員。

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

指定要分組的屬性。 對象會根據指定屬性的值排列成具名群組。 未指定任何屬性時,物件會依其值或 ToString() 其值的表示來分組。 輸出會依組名以遞增順序排序。

Property 參數的值可以是新的導出屬性。 匯出屬性可以是腳本區塊或哈希表。 有效的機碼/值組為:

  • 表達式 - <string><script block>

如需詳細資訊,請參閱 about_Calculated_Properties

Type:Object[]
Position:0
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

輸入

PSObject

您可以使用管線將任何物件傳送至此 Cmdlet。

輸出

GroupInfo

根據預設,此 Cmdlet 會傳回 GroupInfo 物件。

Hashtable

當您使用 AsHashTable 參數時,此 Cmdlet 會傳回 Hashtable 物件。

備註

PowerShell 包含下列的 Group-Object別名:

  • 所有平台:
    • group

您可以使用格式 Cmdlet 的 GroupBy 參數,例如 Format-TableFormat-List來群組物件。 不同於 Group-Object,它會為每個屬性值建立具有數據列的單一數據表, GroupBy 參數會為每個具有屬性值的專案建立一個數據列的數據表。

Group-Object 不需要群組的物件具有相同的 Microsoft .NET 類型。 將不同 .NET 類型的物件分組時, Group-Object 請使用下列規則:

  • 相同的屬性名稱和類型。

    如果物件具有具有指定名稱的屬性,而且屬性值具有相同的 .NET 類型,則屬性值會依相同類型物件所使用的相同規則分組。

  • 相同屬性名稱、不同類型。

    如果物件具有具有指定名稱的屬性,但屬性值在不同的物件中具有不同的 .NET 類型, Group-Object 請使用屬性第一次出現的 .NET 類型做為該屬性群組的 .NET 類型。 當物件具有含不同類型的屬性時,屬性值會轉換為該群組的類型。 如果類型轉換失敗,物件就不會包含在群組中。

  • 遺漏屬性。

    沒有指定屬性的物件無法分組。 未分組的物件會出現在名為 之AutomationNull.Value群組的最後 GroupInfo 物件輸出中。

輸出會依組名的遞增順序排序。 屬於每個群組的專案不會排序。 它們會依收到的順序列出。