$files = Get-ChildItem -Path $PSHOME -Recurse
$files |
Group-Object -Property extension -NoElement |
Sort-Object -Property Count -Descending
Count Name
----- ----
365 .xml
231 .cdxml
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
----- ----
示例 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 参数从输出中删除组的成员。 结果是只有 Count 和 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
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
显示 Get 键的值。 值为 CmdletInfo 对象。 AsString 参数不会将组中的对象转换为字符串。
$A = Get-Command Get-*, Set-* -CommandType cmdlet |
Group-Object -Property Verb -AsHashTable -AsString
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 。
Type:SwitchParameter
Aliases:AHT
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False
-AsString
指示此 cmdlet 将哈希表键转换为字符串。 默认情况下,哈希表键是分组对象的实例。 仅当与 AsHashTable 参数一起使用时,此参数才有效。
Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False
-CaseSensitive
指示此 cmdlet 使分组区分大小写。 在没有此参数的情况下,组中对象的属性值可能有不同的大小写。
从 PowerShell 7 开始,若要创建区分大小写的哈希表,请在命令中包含 CaseSensitive 和 AsHashtable 。
Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False
-Culture
指定要在比较字符串时使用的区域性。
Type:String
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False
-InputObject
指定要分组的对象。 输入一个包含对象的变量,或键入可获取对象的命令或表达式。
使用 InputObject 参数将对象的集合提交到 Group-Object
时, Group-Object
会收到一个表示集合的对象。 因此,它将创建一个组并将该对象用作其成员。
若要对集合中的对象进行分组,请通过管道将对象传递给 Group-Object
。
Type:PSObject
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False
-NoElement
指示此 cmdlet 从结果中省略组的成员。
Type:SwitchParameter
Position:Named
Default value: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
Accept pipeline input:False
Accept wildcard characters:False
PSObject
你可以通过管道将任何对象传递给此 cmdlet。
GroupInfo
默认情况下,此 cmdlet 返回 GroupInfo 对象。
Hashtable
使用 AsHashTable 参数时,此 cmdlet 将返回 一个 Hashtable 对象。
PowerShell 包含以下别名 Group-Object
:
所有平台:
group
可以使用格式设置 cmdlet 的 GroupBy 参数(如 Format-Table
和 Format-List
)对对象进行分组。 与 创建具有每个属性值行的单个表不同 Group-Object
, GroupBy 参数为每个属性值创建一个表,每个具有属性值的项都有一行。
Group-Object
不要求正在分组的对象具有相同的 Microsoft .NET 类型。
对不同 .NET 类型的对象进行分组时, Group-Object
使用以下规则:
相同的属性名称和类型。
如果对象具有具有指定名称的属性,并且属性值具有相同的 .NET 类型,则属性值按将用于同一类型的对象的相同规则进行分组。
相同的属性名称,不同的类型。
如果对象具有具有指定名称的属性,但属性值在不同对象中具有不同的 .NET 类型, Group-Object
请使用属性第一次出现的 .NET 类型作为该属性组的 .NET 类型。 当对象具有不同类型的属性时,会将属性值转换为该组的类型。 如果类型转换失败,则对象不会包含在组中。
缺少属性。
无法对没有指定属性的对象进行分组。 未分组的对象显示在名为 AutomationNull.Value
的组中的最终 GroupInfo 对象输出中。
输出按组名称升序排序。 属于每个组的项不会进行排序。 它们按接收顺序列出。
- about_Calculated_Properties
- about_Hash_Tables
- Compare-Object
- ForEach-Object
- Measure-Object
- New-Object
- Select-Object
- Sort-Object
- Tee-Object
- Where-Object