Group-Object

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

语法

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 对象

是否接受管道输入?

false

是否接受通配符?

false

-AsString

将哈希表键转换为字符串。默认情况下,哈希表键是分组对象的实例。此参数只有在与 AsHashTable 参数一起使用时才有效。

是否为必需?

false

位置?

named

默认值

GroupInfo 对象

是否接受管道输入?

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 参数不会将组中的对象转换为字符串。