Sort-Object 是什么
Sort-Object 按一个或多个属性给管道对象重新排序,默认升序,加上降序参数即可反向排列。它是做排行榜与报表时的必需环节:先排序再取头部,就得到占用最高的前几名;配合分组还能观察每个类别里的分布。因为排序是把全部对象收集齐之后才开始的,所以它属于管道里较重的环节,能先用过滤条件缩小数据集就不要把全量数据丢给它。另外要注意属性类型混用时无法比较,会直接抛出错误。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 及以上 |
|---|---|
| 语法 | Sort-Object [-Property] <属性> [-Descending] [-Unique] [-Stable] [-Top n] |
| 多键排序 | 属性之间用逗号分隔,按先后顺序依次比较 |
| 排序方向 | 整体加降序参数,或对单个属性用哈希表分别指定方向 |
| 稳定排序 | 需要保持相同键值原有顺序时加稳定参数 |
| 去重 | 去重按排序键进行,不是按整行内容去重 |
典型使用场景
- 找出占用资源最多的进程或最占空间的目录条目
- 按时间排序整理事件与文件清单,观察最近发生的变更
- 报表排序:先按类别再按数值,输出层次清晰的清单
- 去重观察:按某属性排序后去重,得到不重复取值列表
- 配合分组统计:先排序再分组,便于按顺序输出结果
- 取极值:升序与降序各取头部,快速定位最大与最小
常用示例
常用示例
# 按工作集内存降序取前 10
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 Name, WS
# 按修改时间降序取最近 5 个文件
Get-ChildItem D:\Logs -File | Sort-Object LastWriteTime -Descending | Select-Object -First 5
# 多键排序:先按类型升序,再按大小降序
Get-ChildItem D:\Data | Sort-Object Extension, @{Expression='Length'; Descending=$true}
# 按属性去重,得到不重复的取值
Get-Service | Sort-Object StartType -Unique | Select-Object StartType
# 保持相同键值原有顺序
Get-ChildItem | Sort-Object Length -Stable | Select-Object -First 3 Name, Length参数与排序方向
| 用法 | 作用 | 注意点 |
|---|---|---|
| -Property | 指定排序依据属性 | 属性不存在时按空值处理,结果无意义 |
| -Descending | 整体降序 | 多键排序时会作用于所有键 |
| 哈希表写法 | 对单个键指定方向 | 格式为表达式与降序两个键的组合 |
| -Unique | 按排序键去重 | 只比较排序键,不会按整行去重 |
| -Stable | 保持相同键值的原始顺序 | 数据量大时略慢,报表场景常用 |
| -Top 与 -Bottom | 只保留头部或尾部 n 条 | 新版本提供,可减少内存占用 |
属性类型混用会报出「无法比较」类错误,例如同一列里既有数字又有文本。处理办法是先用投影把类型统一,或在计算列里显式转换。
排序属于全量操作,数据量越大越慢。想找最大值时,先过滤掉明显不需要的记录,再排序取头部,比直接对全量结果排序更有效率。