PowerShell 技能连载 - 探索 Group-Object
Group-Object
是一个好用的 cmdlet:它可以方便地可视化分组。请查看以下示例:
1 | Get-Process | Group-Object -Property Company |
Basically, the cmdlet builds groups based on the content of a given property. You can also omit the group, and just look at the count if all that matters to you are the number distributions:
基本上,该 cmdlet 基于指定的属性内容创建分组。当您只关注数量分布时,也可以忽略该分组,而只查看总数。
1 | PS C:\> Get-ChildItem -Path c:\windows -File | Group-Object -Property Extension -NoElement | Sort-Object -Property Count -Descending |
如果您对实际对象的分组更感兴趣,可以通过 Group-Object
来返回一个哈希表。通过这种方式,您可以通过他们的键访问每个特定的分组:
1 | $hash = Get-ChildItem -Path c:\windows -File | |
执行的结果将转储 Windows 目录下所有扩展名为 “.exe” 的文件。请注意键(查询的属性)不为字符串的情况。
类似地,如果您使用 PowerShell 远程操作并且扇出到多台计算机来平行地获取信息,当获取到结果时,Group-Object
将会把结果重新分组。这个示例同时从三台机器获取服务信息,而且结果将以随机顺序返回。Group-Object
将会对输入的数据分组,这样您可以操作计算机的结果。和哈希表的操作方法一样,您可以用方括号或点号来存取哈希表的键:
1 | $services = Invoke-Command -ScriptBlock { Get-Service } -ComputerName server1, server2, server3 | Group-Object -Property PSComputerName -AsHashTable |
以下是一个类似的示例,但有一个 bug。您能指出错误吗?
1 | $hash = Get-Service | |
当您查看哈希表时,您可能希望获取正在运行的服务:
1 | PS C:\> $hash |
When you look at the hash table, you would expect to get back the running services:
然而,您并不会获得任何结果。那是因为哈希表中的那个键并不是字符串而是一个 “ServiceControllerStatus” 对象:
1 | PS C:\> $hash.Keys | Get-Member |
要确保获得到的是可存取的键,请总是将 -AsHashTable
和 -AsString
合并使用。后者确保把键转换为字符串。现在示例代码可以按预期工作:
1 | $hash = Get-Service | |
PowerShell 技能连载 - 探索 Group-Object