指定的属性包含相同值的组对象。
语法
Group-Object [-AsHashTable] [-AsString] [[-Property] <Object[]>] [-CaseSensitive] [-Culture <string>] [-InputObject <psobject>] [-NoElement] [<CommonParameters>]
说明
Group-Object cmdlet 基于指定属性的值以组的形式显示对象。Group-Object 返回一个表,其中每个属性值对应一行,同时一个列显示具有该值的项目数。
如果指定多个属性,Group-Object 首先根据第一个属性的值对它们进行分组,然后在每个属性组内,根据下一个属性的值进行分组。
参数
-AsHashTable
以哈希表形式返回组。哈希表的键是对象分组所根据的属性值。哈希表的值是具有该属性值的对象。
AsHashTable 参数通过自身返回每个哈希表,其中每个键是分组对象的实例。当与 AsString 参数一起使用时,哈希表中的键是字符串。
是否为必需? |
false |
位置? |
named |
默认值 |
GroupInfo object |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-AsString
将哈希表键转换为字符串。默认情况下,哈希表键是分组对象的实例。此参数只有在与 AsHashTable 参数一起使用时才有效。
是否为必需? |
false |
位置? |
named |
默认值 |
GroupInfo objects |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-CaseSensitive
使分组区分大小写。如果没有此参数,组中对象的属性值可能具有不同的大小写。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Culture <string>
指定比较字符串时要使用的区域性。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-InputObject <psobject>
指定要分组的对象。输入一个包含对象的变量,或键入可获取对象的命令或表达式。
使用 InputObject 参数将对象集合提交到 Group-Object 时,Group-Object 会收到表示该集合的一个对象。结果,它会创建包含该对象为其成员的单个组。
若要将集合中的对象分组,请通过管道将对象传递到 Group-Object。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
true (ByValue) |
是否接受通配符? |
false |
-NoElement
从结果中忽略某个组的成员。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Property <Object[]>
指定用于分组的属性。对象将基于指定属性的值排列到组中。
Property 参数的值可以是新的计算属性。若要创建计算属性,请创建具有 Expression 键的哈希表,该键指定字符串或脚本块值。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
System.Management.Automation.PSObject 可以通过管道将任何对象传递给 Group-Object。 |
输出 |
Microsoft.PowerShell.Commands.GroupInfo 或 System.Collections.Hashtable 使用 AsHashTable 参数时,Group-Object 会返回哈希表。否则,它返回 GroupInfo 对象。 |
说明
还可以使用格式化 cmdlet(如 Format-Table [m2] 和 Format-List [m2])的 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 对象的输出中。
示例 1
C:\PS>get-childitem *.doc | group-object -property length 说明 ----------- 此命令获取当前位置中具有 .doc 扩展名的文件,并按大小分组。
示例 2
C:\PS>get-childitem | sort-object -property extension | group-object -property extension 说明 ----------- 此命令获取当前位置中的文件,按文件扩展名排序,然后按文件扩展名分组。请注意,文件是在分组之前进行排序的。
示例 3
C:\PS>1..35 | group-object -property {$_ % 2},{$_ % 3} 说明 ----------- 此示例演示了如何将脚本块用作 Property 参数的值。 此命令显示从 1 到 35 的整数,并按除以 2 或 3 后的余数分组。
示例 4
C:\PS>$events = get-eventlog -logname system -newest 1000 C:\PS> $events | group-object -property eventID Count Name Group ----- ---- ----- 44 Information {System.Diagnostics.EventLogEntry, 5 Error {System.Diagnostics.EventLogEntry, 1 Warning {System.Diagnostics.EventLogEntry} 说明 ----------- 这些命令显示系统事件日志中的 1,000 个最新条目,它们按事件 ID 分组。 第一个命令使用 Get-EventLog cmdlet 检索事件和赋值运算符 (=) 以将其保存在 $events 变量中。 第二个命令使用管道运算符 (|) 将 $events 变量中的事件发送到 Group-Object cmdlet。该命令使用 Property 参数指定事件应根据其 EventID 属性的值进行分组。 在输出中,Count 列表示每组中的条目数,Name 列表示用于定义一个组的 EventID 值,而 Group 列表示每组中的对象。
示例 5
C:\PS>get-process | group-object -property priorityclass Count Name Group ----- ---- ----- 55 Normal {System.Diagnostics.Process (AdtAgent), System.Diagnostics.Process (alg), System.Dia... 1 {System.Diagnostics.Process (Idle)} 3 High {System.Diagnostics.Process (Newproc), System.Diagnostics.Process (winlogon), System.D... 2 BelowNormal {System.Diagnostics.Process (winperf), C:\PS>get-process | group-object -property company -noelement Count Name ----- ---- 55 Normal 1 3 High 2 BelowNormal 说明 ----------- 此示例演示了 NoElement 参数的效果。这些命令将计算机上的进程按优先级类分组。 第一个命令使用 Get-Process cmdlet 来获取计算机上的进程。它使用管道运算符 (|) 将结果发送到 Group-Object,其根据进程的 PriorityClass 属性的值将对象分组。 第二个命令与第一个相同,但是它使用 NoElement 参数将组的成员从输出中清除。结果是一个仅包含计数和属性值名称的表。 结果显示在下面的示例输出中。
示例 6
C:\PS>get-eventlog -logname system -newest 1000 | group-object -property {$_.TimeWritten - $_.TimeGenerated} 说明 ----------- 此命令演示了如何以脚本块形式提供 Property 参数的值。 此命令显示系统事件日志中最新的 1,000 个条目,它们按从生成到写入日志之间的时间进行分组。 该命令使用 Get-EventLog cmdlet 获取事件日志条目。它使用管道运算符 (|) 将条目发送到 Group-Object cmdlet。Property 参数的值被指定为一个脚本块(大括号内的表达式)。计算该脚本块的结果是日志条目从生成到写入日志之间的时间。该值用于对 1000 个最新的事件进行分组。
示例 7
C:\PS>get-childitem | group-object extension -noelement Count Name ----- ---- 21 82 .txt 9 .cmd 5 .log 12 .xml 5 .htm 36 .ps1 1 .psc1 3 .exe 6 .csv 1 .psd1 2 .bat 说明 ----------- 此命令按文件扩展名对当前目录中的项目分组。它使用 NoElement 参数忽略组的成员。 结果显示在下面的示例输出中。
示例 8
C:\PS>"a", "b", "c", "c", "d" | get-unique a b c d C:\PS> "a", "b", "c", "c", "d" | group-object -noelement | where {$_.Count -gt 1} Count Name ----- ---- 2 c C:\PS> get-process | group-object -property Name -noelement | where {$_.count -gt 1} Count Name ----- ---- 2 csrss 5 svchost 2 winlogon 2 wmiprvse 说明 ----------- 此示例演示了如何查找集合中的唯一和非唯一(重复)属性值。 第一个命令通过管道将某个数组传递到 Get-Unique cmdlet 来获取该数组的唯一元素。 第二个命令获取某个数组的非唯一元素。它通过管道将该数组传递到 Group-Object cmdlet,其根据值将对象分组。所得到的组将通过管道传递到 Where-Object cmdlet,其选择具有包含多个成员的组的对象。 第三个命令演示了此技术的实际用途。它使用相同的方法查找计算机上具有相同进程名称的进程。 结果显示在下面的示例输出中。
示例 9
C:\PS>$a = get-command get-*, set-* -type cmdlet | group-object -property verb -ashashtable -asstring C:\PS> $a Name Value ---- ----- Get {Get-PSCallStack, Get-PSBreakpoint, Get-PSDrive, Get-PSSession...} Set {Set-Service, Set-StrictMode, Set-PSDebug, Set-PSSessionConfiguration...} C:\PS> $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 和 AsString 参数在哈希表中返回组,即以键-值对集合的形式。 在所得的哈希表中,每个属性值是一个键,而组元素是值。因为每个键是哈希表对象的一个属性,所以可以使用点标记来显示这些值。 第一个命令获取会话中的 Get 和 Set cmdlet,将它们按谓词分组,以哈希表形式返回这些组,然后将该哈希表保存在 $a 变量中。 第二个命令显示 $a 变量中的哈希表。有两个键-值对,一个对应 Get cmdlet,一个对应 Set cmdlet。 第三个命令使用点标记显示 $a 中的 Get 键的值。这些值是 CmdletInfo 对象。AsString 参数不会将组中的对象转换为字符串。