首页/系统/Windows 运维速查/Select-Object 取列与取样
PowerShell 基础66 条

Select-Object 取列与取样

投影对象属性、限制数量、生成新对象:整理输出与 Top N 展示的核心工具。

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

Select-Object 是什么

Select-Object 做两件事:一是投影属性,从对象里挑出需要的列,丢掉其余部分;二是截取切片,取前 N 条、后 N 条或跳过前面若干条。它还能用哈希表语法生成计算列,把字节数换算成兆字节、把时间格式化,或者干脆给列起一个中文名。整理输出、做 Top N 排行、为导出 CSV 准备字段,都靠它完成。需要注意的是它只处理对象本身,不改变上游取数的范围,所以放在管道的哪个位置会影响性能。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7 及以上
语法Select-Object [-Property] <属性列表> [-First n] [-Last n] [-Skip n] [-Unique] [-ExpandProperty 属性]
计算列语法@{Name='列名'; Expression={ 表达式 }},Name 可简写 n,Expression 可简写 e
常用切片-First 取前 n 条、-Last 取末尾、-Skip 跳过前若干条、-SkipLast 跳过末尾
-ExpandProperty展开单个属性并去掉外层对象,适合只想要值列表的场景
组合常接在 Sort-Object 之后做 Top N,或接在 Where-Object 之后做字段裁剪

典型使用场景

  • 进程资源排行:先排序再取前 10 条,只保留名称与占用字段
  • 目录清单整理:把字节数换算成兆字节,便于人工快速判断量级
  • 导出报表:先裁字段再导出 CSV,避免把几十个无用列写入文件
  • 批量取值:用展开参数把某个属性抽成一串纯值,交给循环处理
  • 抽样查看:只看前几条确认数据形态,避免刷屏
  • 去重展示:用唯一参数按关键字段去重,观察有哪些不同取值

常用示例

常用示例
# 取前 5 个进程的名称、编号与累计 CPU
Get-Process | Select-Object -First 5 Name, Id, CPU
# 计算列:换算成 MB 并保留两位小数
Get-ChildItem C:\Logs -File | Select-Object Name, @{n='MB';e={[math]::Round($_.Length/1MB,2)}}
# Top N:先排序再截取
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 @{n='进程';e={$_.ProcessName}}, @{n='内存MB';e={[math]::Round($_.WS/1MB)}}
# 只要值,不要外层对象
Get-ChildItem C:\Windows -File | Select-Object -ExpandProperty Name
# 去重观察有哪些启动类型
Get-Service | Select-Object -Property StartType -Unique

常用参数速查

参数作用注意点
-Property指定要保留的属性列写不存在的属性名会得到一列空值
-First n取最前面 n 条会提前终止上游管道,大吞吐场景下会出现管道停止提示
-Last n取最后 n 条需要上游全部产完,内存占用随数据量增长
-Skip n跳过前 n 条常与 -First 搭配做分页
-Unique按比较结果去重只比较选定属性,不是整对象去重
-ExpandProperty展开单个属性取值与 -Property 同时使用会互相干扰,需二选一
计算列在导出 CSV 时同样会保留,所以「先算好人类可读的列再导出」是常见做法;但中文列名在不同系统之间传递时可能乱码,做系统间交换建议保留英文列名。
只做纯取值与换算时,Select-Object 比 ForEach-Object 更轻,因为它不需要为每条记录执行完整的脚本块;需要副作用(调用方法、写文件)时才交给 ForEach-Object。
计算列里的表达式必须用 $_ 指代当前对象,并且整段要包在花括号中;如果只是想改个列名,也可以写成「新名 = 旧名」的哈希表形式,不必写完整表达式。

与其他环节的配合

  • 接在 Where-Object 之后裁字段,先筛后选能减少投影的对象数量
  • 接在 Sort-Object 之后取头部,构成 Top N 的标准写法
  • 接在 Get-ChildItem 之后做单位换算,让输出更容易读懂
  • 作为 Export-Csv 的上一步,先把列定好再落盘
  • 与 Group-Object 搭配时先精简字段,分组统计的中间对象会更小

计算属性的常见换算

  • 内存与磁盘:字节除以 1KB、1MB、1GB,再取整保留小数
  • 时间:把日期时间对象按需要的格式转成字符串输出
  • 比值:用两个属性相除,得到使用率或占比类指标
  • 分类:用条件表达式把数值映射成达标、超标等文字标签

易错点

  • -First 会提前截断上游:日志里出现「管道已停止」提示、或上游命令报出中止异常,多与此有关,大吞吐场景需要确认是否可接受
  • -ExpandProperty 与 -Property 同时使用会互相干扰,输出结构与预期不符,两者应二选一
  • 对大批数据使用 -Last 会把全部结果留在内存里,数据量上涨时容易吃满内存,能改成排序取头部就不要用尾部
  • -Unique 按选定属性比较,不是按整个对象去重,想看完整不同的行需要把所有字段都列出来
  • 属性名写错不会报错,只会得到一列空值,取值前先用 Get-Member 核对真实属性名

数据来源与参考

  • Microsoft Learn:Select-Object

相关工具

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