powershell的group-object支持多重属性嵌套分组,按property参数顺序逐级划分;可用脚本块实现动态条件分组;配合-ashashtable生成可索引哈希表;结合where-object筛选子组并展开成员。
powershell 的 group-object 支持多重属性分组,本质是“嵌套分组”:先按第一个属性划分大组,再在每个大组内部按第二个属性细分,依此类推。这不是并列条件筛选,而是层级结构化归类。
按多个属性顺序分组(基础用法)
直接传入数组形式的 -Property 参数即可,顺序决定分组优先级:
-
Get-Process | Group-Object -Property Company, Name:先按Company分大组(如 Microsoft、Google),每组内再按Name(进程名)细分 - 结果中每个
GroupInfo对象的Name属性会显示为类似@{Company=Microsoft; Name=chrome}的哈希表字符串(PowerShell 7+ 默认行为) - 若想让
Name更易读,可加-AsString,但注意它只影响输出显示,不影响分组逻辑
用脚本块实现动态多维分组
当属性组合需计算或条件判断时,用脚本块比静态属性更灵活:
-
Get-ChildItem | Group-Object -Property { if ($_.Length -gt 1MB) { 'Large' } else { 'Small' } }, Extension:先按大小分类,再按扩展名细分 - 脚本块中可访问
$_的任意属性,支持if/switch、正则匹配、甚至调用函数 - 多个脚本块也可混用,例如
-Property { $_.LastWriteTime.Year }, { $_.Mode -match 'd' }(年份 + 是否为目录)
结合 -AsHashTable 构建快速索引结构
多重属性分组后生成哈希表,适合后续高频查找:
$ht = Get-Service | Group-Object -Property Status, StartType -AsHashTable -AsString- 键名变成类似
"Running, Automatic"的字符串,可直接索引:$ht["Running, Automatic"] - 注意:
-AsHashTable不支持-NoElement,返回的是完整对象集合;若只需计数,仍建议用Group-Object | Select-Object Name, Count
配合 Where-Object 和 Select-Object 提取特定子组
多重分组后常需筛选某一层级的结果:
Get-EventLog -Log System -Newest 100 | Group-Object -Property EntryType, Source | Where-Object { $_.Name -like "*Error*" } | Select-Object Name, Count- 也可展开具体成员:
... | Where-Object { $_.Name -eq "@{EntryType=Error; Source=Application Error}" } | Select-Object -ExpandProperty Group | Select-Object TimeGenerated, Message - 小技巧:用
ConvertTo-Json -Compress查看复杂Name结构,避免手动拼错键名











