Group-Object
对包含指定属性的相同值的对象进行分组。
语法
		HashTable
	 
	Group-Object
    [[-Property] <Object[]>]
    [-NoElement]
    [-AsHashTable]
    [-AsString]
    [-InputObject <PSObject>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]
说明
              Group-Object cmdlet 根据指定属性的值在组中显示对象。
              Group-Object 返回一个表,其中包含每个属性值的一行,一列显示具有该值的项数。
如果指定多个属性,Group-Object 首先按第一个属性的值对其进行分组,然后在每个属性组中按下一个属性的值分组。
从 PowerShell 7 开始,Group-Object 可以结合 CaseSensitive 和 AsHashtable 参数来创建区分大小写的哈希表。 哈希表键使用区分大小写的比较,并输出 System.Collections.Hashtable 对象。
示例
示例 1:按扩展名对文件进行分组
此示例以递归方式获取 $PSHOME 下的文件,并按文件扩展名对其进行分组。 输出将发送到 Sort-Object cmdlet,该 cmdlet 按为给定扩展名找到的计数文件对其进行排序。 空 名称 表示目录。
此示例使用 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:按奇数和偶数对整数进行分组
此示例演示如何使用脚本块作为 属性 参数的值。 此命令显示从 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 对事件日志事件进行分组 
	本示例显示系统事件日志中的 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 参数从输出中删除组的成员。 结果是仅具有 计数 和 Name 属性值的表。
结果显示在以下示例输出中。
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:对哈希表中的对象进行分组
此示例使用 AsHashTable 和 AsString 参数将哈希表中的组作为键值对的集合返回。
在生成的哈希表中,每个属性值都是一个键,组元素是值。 由于每个键都是哈希表对象的属性,因此可以使用点表示法来显示值。
第一个命令获取会话中的 Get 和 Set cmdlet,按谓词将它们分组,以哈希表的形式返回组,并将哈希表保存在 $A 变量中。
第二个命令显示 $A中的哈希表。 有两个键值对,一个用于 Get cmdlet,一个用于 Set cmdlet。
第三个命令使用点表示法,$A.Get 在 中显示 $A 键的值。 这些值 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:创建区分大小写的哈希表
此示例结合了 CaseSensitive 和 AsHashTable 参数来创建区分大小写的哈希表。 示例中的文件扩展名为 .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 使用 属性 值 扩展对对象进行分组。 
              CaseSensitive 和 AsHashTable 参数创建哈希表,并使用区分大小写的键分组 .txt 和 .TXT。
参数
-AsHashTable  
		指示此 cmdlet 将组作为哈希表返回。 哈希表的键是对象分组依据的属性值。 哈希表的值是具有该属性值的对象。
AsHashTable 参数返回每个哈希表,其中每个键是分组对象的实例。 与 AsString 参数一起使用时,哈希表中的键是字符串。
从 PowerShell 7 开始,若要创建区分大小写的哈希表,请在命令中包含 CaseSensitive 和 AsHashtable。
参数属性
| 类型: | SwitchParameter | 
| 默认值: | False | 
| 支持通配符: | False | 
| 不显示: | False | 
| 别名: | 平均处理时间 (AHT) | 
参数集
(All)
| Position: | Named | 
| 必需: | False | 
| 来自管道的值: | False | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
-AsString 
		指示此 cmdlet 将哈希表键转换为字符串。 默认情况下,哈希表键是分组对象的实例。 此参数仅在与 AsHashTable 参数一起使用时才有效。
参数属性
| 类型: | SwitchParameter | 
| 默认值: | False | 
| 支持通配符: | False | 
| 不显示: | False | 
参数集
(All)
| Position: | Named | 
| 必需: | False | 
| 来自管道的值: | False | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
-CaseSensitive 
		指示此 cmdlet 使分组区分大小写。 如果没有此参数,组中对象的属性值可能有不同的大小写。
从 PowerShell 7 开始,若要创建区分大小写的哈希表,请在命令中包含 CaseSensitive 和 AsHashtable。
参数属性
| 类型: | SwitchParameter | 
| 默认值: | False | 
| 支持通配符: | False | 
| 不显示: | False | 
参数集
(All)
| Position: | Named | 
| 必需: | False | 
| 来自管道的值: | False | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
-Culture
指定比较字符串时要使用的区域性。
参数属性
| 类型: | String | 
| 默认值: | None | 
| 支持通配符: | False | 
| 不显示: | False | 
参数集
(All)
| Position: | Named | 
| 必需: | False | 
| 来自管道的值: | False | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
-InputObject 
		指定要分组的对象。 输入包含对象的变量,或键入获取对象的命令或表达式。
使用 InputObject 参数将对象集合提交到 Group-Object时,Group-Object 接收一个表示集合的对象。 因此,它会创建一个将该对象作为其成员的组。
若要对集合中的对象进行分组,请通过管道将对象传递给 Group-Object。
参数属性
| 类型: | PSObject | 
| 默认值: | None | 
| 支持通配符: | False | 
| 不显示: | False | 
参数集
(All)
| Position: | Named | 
| 必需: | False | 
| 来自管道的值: | True | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
-NoElement 
		指示此 cmdlet 从结果中省略组的成员。
参数属性
| 类型: | SwitchParameter | 
| 默认值: | False | 
| 支持通配符: | False | 
| 不显示: | False | 
参数集
(All)
| Position: | Named | 
| 必需: | False | 
| 来自管道的值: | False | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
-Property
指定分组的属性。 这些对象根据指定属性的值排列成命名组。 如果未指定任何属性,则对象按其值或其值的 ToString() 表示形式进行分组。 输出按组名称按升序排序。
属性的 参数值可以是一个新计算得出的属性。 计算属性可以是脚本块或哈希表。 有效的键值对包括:
- 表达式 - <string>或<script block>
有关详细信息,请参阅 about_Calculated_Properties。
参数属性
| 类型: | Object[] | 
| 默认值: | None | 
| 支持通配符: | False | 
| 不显示: | False | 
参数集
(All)
| Position: | 0 | 
| 必需: | False | 
| 来自管道的值: | False | 
| 来自管道的值(按属性名称): | False | 
| 来自剩余参数的值: | False | 
CommonParameters
此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters。
输入
PSObject
你可以通过管道将任何对象传递给此 cmdlet。
输出
GroupInfo
默认情况下,此 cmdlet 返回 GroupInfo 对象。
Hashtable
使用 AsHashTable 参数时,此 cmdlet 将返回 哈希表 对象。
备注
PowerShell 包含以下与 Group-Object相关的别名:
- 所有平台:- group
 
可以使用格式化 cmdlet(如  和 Format-Table)的 Format-List 参数对对象进行分组。 与 Group-Object不同,它为每个属性值创建一个具有行的单个表,GroupBy 参数为每个属性值创建一个表,每个具有属性值的项都有一行。
              Group-Object 不需要分组的对象与 .NET 类型相同Microsoft。
将不同 .NET 类型的对象分组时,Group-Object 使用以下规则:
- 相同的属性名称和类型。 - 如果对象具有具有指定名称的属性,并且属性值具有相同的 .NET 类型,则属性值按将用于相同类型的对象的相同规则进行分组。 
- 相同的属性名称,不同类型的。 - 如果对象具有具有指定名称的属性,但属性值在不同对象中具有不同的 .NET 类型, - Group-Object使用属性组的第一个匹配项的 .NET 类型作为该属性组的 .NET 类型。 当对象具有具有不同类型的属性时,属性值将转换为该组的类型。 如果类型转换失败,该对象不会包含在组中。
- 缺少属性。 - 不能对没有指定属性的对象进行分组。 未分组的对象显示在名为 的组中的最后 - AutomationNull.Value对象输出中。
输出按组名称按升序排序。 属于每个组的项未排序。 它们按接收顺序列出。