PowerShell中Group-Object按属性或脚本块分组,生成分组对象;支持-NoElement精简输出、-AsHashTable转哈希表、多属性嵌套及大小写控制。
powershell 中用 group-object(可简写为 group)对管道对象分组,核心是按指定属性值或脚本块逻辑把相同特征的对象归为一组。它不改变原始对象,只生成分组结果,后续常配合 sort-object、select-object 或哈希表访问进一步处理。
按单个属性快速分组
最常用方式:直接指定属性名,比如文件扩展名、进程名、日志级别等。
-
Get-ChildItem | Group-Object Extension—— 按扩展名分组,每组包含所有同扩展名的文件对象 -
Get-Process | Group-Object Company—— 按公司信息(如 Microsoft、Google)分组进程 - 加
-NoElement可省略具体成员,只显示每组数量和键值:Get-ChildItem | Group Extension -NoElement
用脚本块实现动态分组逻辑
当没有现成属性可用,或需自定义规则时(如奇偶、范围、字符串截取),用 { } 写脚本块作为 -Property 值。
-
1..20 | Group-Object { $_ % 2 }—— 分成余数为 0(偶数)和 1(奇数)两组 -
Get-ChildItem | Group-Object { [Math]::Floor($_.Length / 1024) }—— 按 KB 整数部分分组(如 0KB、1KB、2KB…) -
Get-EventLog -LogName System -Newest 100 | Group-Object { $_.EntryType.ToString().Substring(0,1) }—— 按日志类型首字母(E、W、I)分组
生成哈希表提升查找效率
加 -AsHashTable 参数,把分组结果转为哈希表,用键直接索引对应组,适合频繁查询场景。
-
$groups = Get-ChildItem | Group-Object Name -AsHashTable—— 键是文件名,值是同名文件集合(注意:若文件名重复会覆盖) - 加
-AsString确保键是字符串类型,避免类型不匹配问题:Group Length -AsHashTable -AsString - 查某组:
$groups["myfile.txt"]或$groups["499"](若按长度分组且用了-AsString)
多级分组与大小写控制
支持多个属性嵌套分组,也支持区分大小写的精确匹配。
-
Get-ChildItem | Group-Object DirectoryName, Extension—— 先按目录路径分大组,每组内再按扩展名细分 -
Get-ChildItem | Group-Object Name -CaseSensitive—— 把Readme.txt和README.TXT视为不同组 - 搭配
-Culture可按特定语言规则比较(如德语变音符号),一般默认系统区域即可


















