Group-Object

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

Syntax

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

Description

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

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

範例

範例 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:依 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...}

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

此範例示範 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

範例 5:依名稱分組進程

下列範例會使用 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

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

這個範例會 使用 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                           3.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Get-Alias                         3.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-AppLockerFileInformation      2.0.0.0    AppLocker
Cmdlet          Get-AppLockerPolicy               2.0.0.0    AppLocker
...

範例 10:使用匯出屬性分組哈希表的索引鍵值

此範例示範如何依索引鍵的值將哈希表物件分組。 您可以為 Property 參數指定一或多個腳本區塊 這些腳本區塊中的表達式可用來分組輸入,例如具名屬性的值。

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

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

參數

-AsHashTable

指出此 Cmdlet 會將群組當做哈希表傳回。 哈希表的索引鍵是物件分組的屬性值。 哈希表的值是具有該屬性值的物件。

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

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 會區分大小寫。 如果沒有此參數,群組中對象的屬性值可能會有不同的情況。

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 物件。

備註

Windows 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 物件輸出中。

輸出群組會依建立群組的順序呈現。 屬於每個群組的專案不會排序。 它們會依收到的順序列出。