PowerShell 基础66 条

Sort-Object 排序

按一个或多个属性排序,支持升降序与去重,常用于 Top N 与报表整理。

Windows 运维速查系统更新于 2026-10-13

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 条新版本提供,可减少内存占用
属性类型混用会报出「无法比较」类错误,例如同一列里既有数字又有文本。处理办法是先用投影把类型统一,或在计算列里显式转换。
排序属于全量操作,数据量越大越慢。想找最大值时,先过滤掉明显不需要的记录,再排序取头部,比直接对全量结果排序更有效率。

易错点

  • 属性类型混用直接排序:会抛出无法比较的错误,需要先用投影或计算列统一类型
  • 把去重当成整行去重:去重只按排序键比较,结果与预期行数不符,需要列出全部关键字段
  • 多键排序时误以为降序只作用于最后一个键:整体参数会作用于所有键,需要分别指定时要用哈希表写法
  • 在大数据集上先排序再过滤:排序需要收齐全部对象,顺序调换能显著降低开销
  • 依赖默认排序的稳定性:不指定稳定参数时相同键值的顺序不确定,报表需要可复现的结果时要显式声明

数据来源与参考

  • Microsoft Learn:Sort-Object

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌