Group-Object

包含相同指定属性的值的组对象。

语法

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

说明

Group-Object cmdlet 根据指定属性的值在组中显示对象。 Group-Object 返回一个表,其中每个属性值各有一行,并返回一列,该列显示具有该值的项数。

如果指定多个属性, Group-Object 则首先按第一个属性的值对它们进行分组,然后在每个属性组中按下一个属性的值进行分组。

从 PowerShell 7 开始, Group-Object 可以组合 CaseSensitiveAsHashtable 参数来创建区分大小写的哈希表。 哈希表键使用区分大小写的比较,并输出 System.Collections.Hashtable 对象。

示例

示例 1:按扩展名对文件进行分组

此示例以递归方式获取 下 $PSHOME 的文件,并按文件扩展名对其进行分组。 输出将发送到 Sort-Object cmdlet,该 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 对事件日志事件进行分组

此示例显示系统事件日志中的 1,000 个最新条目,按 EntryType 分组。

在输出中, Count 列表示每个组中的条目数。 Name 列表示定义组的 EventType 值。 Group 列表示每个组中的对象。

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

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

示例 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                             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
...

示例 7: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

指定用于分组的属性。 根据指定属性的值将对象排列成组。

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

可以通过管道将任何对象传递给 Group-Object

输出

Microsoft.PowerShell.Commands.GroupInfo or System.Collections.Hashtable

使用 AsHashTable 参数时, Group-Object 返回 一个 Hashtable 对象。 否则,它将返回 一个 GroupInfo 对象。

备注

可以使用格式设置 cmdlet 的 GroupBy 参数(如 Format-TableFormat-List)对对象进行分组。 GroupBy 参数为每个属性值创建包含行的单个表不同Group-Object,它为每个属性值创建一个表,每个具有 属性值的项都有一行。

Group-Object 不要求分组的对象属于同一 Microsoft .NET Core 类型。 对不同 .NET Core 类型的对象进行分组时, Group-Object 使用以下规则:

  • 相同的属性名称和类型。

    如果对象具有具有指定名称的属性,并且属性值具有相同的 .NET Core 类型,则使用将用于同一类型的对象的相同规则对属性值进行分组。

  • 相同的属性名称,不同的类型。

    如果对象具有具有指定名称的属性,但属性值在不同的对象中具有不同的 .NET Core 类型, Group-Object 请使用该属性的第一个匹配项的 .NET Core 类型作为该属性组的 .NET Core 类型。 当对象具有不同类型的属性时,会将属性值转换为该组的类型。 如果类型转换失败,则对象不包括在组中。

  • 缺少属性。

    不能对没有指定属性的对象进行分组。 未分组的对象显示在名为 AutomationNull.Value的组中的最终 GroupInfo 对象输出中。