按一个或多个属性排序对象,支持降序、去重和计算排序键。
Sort-Object 接收管道对象,按 -Property 指定的属性排序并输出原对象;不指定属性时按对象自身值排序。别名是 sort。多个属性用数组,默认全部升序;需要对单个属性降序时用哈希表 @{Expression='Length';Descending=$true}。-Unique 在排序后去重,-CaseSensitive 改变字符串比较,-Culture 指定区域规则。
管道:按值接收对象,必须等全部输入到齐才能排序,因此是缓冲型命令。权限:本身不需要权限;能读取的属性取决于上游。边界:Sort-Object 排顺序,Group-Object 做分组,Select-Object -First 只截取;取 Top N 仍需先排序,大输入要评估内存。
版本:5.1 的排序默认受当前区域设置影响,相同键的元素不保证保持原顺序;7.x 差异:提供 -Stable 明确要求稳定排序,跨版本结果需要固定顺序时加显式次级排序键。
# 1. 按内存降序,取占用最高的进程
PS C:\> Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 Name, Id
# 2. 多属性排序,先按状态再按显示名
PS C:\> Get-Service | Sort-Object Status, DisplayName | Select-Object Status, Name
# 3. 只对长度降序,再用名称升序作为次级键
PS C:\> Get-ChildItem C:\Logs -File | Sort-Object @{Expression='Length';Descending=$true}, Name
# 4. 排序后去重,适合清理重复的清单行
PS C:\> Get-Content C:\Data\names.txt | Sort-Object -Unique
# 5. 按计算出的键排序,例如目录名长度
PS C:\> Get-ChildItem C:\Apps -Directory | Sort-Object { $_.Name.Length }
# 6. 区分大小写排序,验证名称冲突
PS C:\> Get-Process | Sort-Object -Property Name -CaseSensitive | Select-Object -First 10 Name
'10' 会排在 '9' 前面;要按数值排,把属性转成整数,例如 Sort-Object { [int]$_.Port }。Where-Object 过滤空值。-Culture 或统一转成不变文化字符串。-Unique 默认不区分大小写,且比较的是所选属性组合;需要区分大小写时加 -CaseSensitive。Sort-Object 会缓冲全部输入,大文件/大结果集可能吃内存;能在上游用提供程序过滤就不要先全量排序。-Stable。Select-Object -First 仍会先读完输入;如果只需要最大的一项,考虑用 Measure-Object -Maximum 或循环比较。Select-Object — 排序后截取前 N 条或选择字段。Where-Object — 排序前先缩小结果集。Get-Process — 常与按内存/CPU 排序组合。Get-ChildItem — 常与按大小/时间排序组合。合上页面,先回答,再展开对照。
80, 443, 8080 之外的奇怪顺序?-Unique 默认区分大小写吗?它比较的是什么?-Stable。
小程序版
微信扫码,随时查命令