Group-Object
包含相同指定属性的值的组对象。
语法
Group-Object
[[-Property] <Object[]>]
[-NoElement]
[-AsHashTable]
[-AsString]
[-InputObject <PSObject>]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
说明
cmdlet Group-Object
根据指定属性的值按组显示对象。
Group-Object
返回一个表,其中包含每个属性值的一行,以及一个显示具有该值的项数的列。
如果指定多个属性, Group-Object
则首先按第一个属性的值对其进行分组,然后在每个属性组中按下一个属性的值进行分组。
示例
示例 1:按扩展名对文件进行分组
此示例以递归方式获取下 $PSHOME
的文件,并按文件扩展名对其进行分组。 输出将发送到 cmdlet, 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 1 {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
10 0 {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
示例 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 参数从输出中删除组的成员。 结果是一个仅具有计数和属性值名称的表。
结果显示在下面的示例输出中。
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
在本地计算机上运行的进程的多个实例。
Get-Process | Group-Object -Property Name -NoElement | Where {$_.count -gt 1}
Count Name
----- ----
2 csrss
5 svchost
2 winlogon
2 wmiprvse
示例 8:对哈希表中的对象进行分组
此示例使用 AsHashTable 和 AsString 参数返回哈希表中的组,即作为键值对的集合。
在生成的哈希表中,每个属性值都是一个键,组元素是值。 因为每个键都是哈希表对象的一个属性,所以你可以使用点表示法来显示这些值。
第一个命令获取 Get
会话中的 和 Set
cmdlet,按谓词将它们分组,将组作为哈希表返回,并将哈希表保存在 变量中 $A
。
第二个命令显示 中的 $A
哈希表。
有两个键值对,一个用于 Get
cmdlet,一个用于 Set
cmdlet。
第三个命令使用点表示法在 中$A
显示 Get 键的值。
值为 CmdletInfo 对象。
AsString 参数不会将组中的对象转换为字符串。
$A = Get-Command get-*, set-* -CommandType cmdlet | Group-Object -Property verb -AsHashTable -AsString
$A
Name Value
---- -----
Get {Get-PSCallStack, Get-PSBreakpoint, Get-PSDrive, Get-PSSession...}
Set {Set-Service, Set-StrictMode, Set-PSDebug, Set-PSSessionConfiguration...}
$A.get
CommandType Name Definition
----------- ---- ----------
Cmdlet Get-PSCallStack Get-PSCallStack [-Verbose] [-Debug] [-ErrorAction <ActionPrefer...
Cmdlet Get-PSBreakpoint Get-PSBreakpoint [[-Id] <Int32[]>] [-Verbose] [-Debug] [-ErrorA...
Cmdlet Get-PSDrive Get-PSDrive [[-Name] <String[]>] [-Scope <String>] [-PSProvider...
...
参数
-AsHashTable
指示此 cmdlet 将组作为哈希表返回。 哈希表的键是作为对象分组依据的属性值。 哈希表的值是具有该属性值的对象。
AsHashTable 参数本身返回每个哈希表,其中每个键都是分组对象的实例。 与 AsString 参数一起使用时,哈希表中的键是字符串。
Type: | SwitchParameter |
Aliases: | AHT |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-AsString
指示此 cmdlet 将哈希表键转换为字符串。 默认情况下,哈希表键是分组对象的实例。 仅当与 AsHashTable 参数一起使用时,此参数才有效。
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-CaseSensitive
指示此 cmdlet 使分组区分大小写。 在没有此参数的情况下,组中对象的属性值可能有不同的大小写。
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
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: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Property
指定用于分组的属性。 根据指定属性的值将对象排列成组。
Property 参数的值可以是新的计算属性。 若要创建计算属性,请使用指定字符串或脚本块值的 Expression 键创建哈希表。
Type: | Object[] |
Position: | 0 |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
输入
可以通过管道将任何对象传递给 Group-Object
。
输出
Microsoft.PowerShell.Commands.GroupInfo or System.Collections.Hashtable
使用 AsHashTable 参数时, Group-Object
将返回哈希表。
否则,它将返回 GroupInfo 对象。
备注
还可以使用格式设置 cmdlet ((如
Format-Table
和Format-List
) )的 GroupBy 参数对对象进行分组。 与 创建具有每个属性值行的单个表不同Group-Object
, GroupBy 参数为每个属性值创建一个表,并为每个具有属性值的项创建一行。Group-Object
不要求正在分组的对象属于同一个 Microsoft .NET Framework 类型。 对不同.NET Framework类型的对象进行分组时,Group-Object
使用以下规则:相同的属性名称和类型。 如果对象具有带指定名称的属性,并且属性值具有相同的 .NET Framework 类型,则通过使用相同类型的对象适用的规则对属性值进行分组。
相同的属性名称,不同的类型。 如果对象具有具有指定名称的属性,但属性值在不同对象中具有不同的.NET Framework类型,
Group-Object
请使用该属性第一次出现的.NET Framework类型作为该属性组的.NET Framework类型。 当对象具有不同类型的属性时,会将属性值转换为该组的类型。 如果类型转换失败,则不会将该对象包含在组中。缺少属性。 将不具有指定属性的对象视为不可分组。 不可组合的对象显示在名为
AutomationNull.Value
的组中的最终 GroupInfo 对象输出中。