系统学习 Windows 学习路径:从 CMD 到 PowerShell、系统网络,再到 WSL 与 Server

Select-Object

挑选属性、计算列或前后 N 条记录,把对象裁剪成需要的形状。

补充说明

Select-Object 默认按 -Property 生成只含所选属性的 PSCustomObject;不加 -Property 时原样传递对象。它支持 -First、-Last、-Skip、-Unique、-ExpandProperty、-ExcludeProperty 和计算属性;别名是 select。计算属性写成 @{Name='MB';Expression={...}},Expression 里的 $_ 指向当前对象。

管道:按值接收对象,是典型的下游裁剪命令。权限:本身不需要权限,能选什么取决于上游对象。边界:Where-Object 筛行,Select-Object 选列/截断;Format-Table 只影响显示,不能用于后续计算。

版本:5.1 支持计算属性、-First/-Last/-Skip/-ExpandProperty 等常用参数;7.x 差异:新增 -SkipLast,-First 仍会提前停止上游管道,-Last 仍会缓冲全部输入。跨版本脚本不要使用 5.1 不存在的参数。

常用示例

# 1. 只取前 5 个进程的少量字段,减少输出噪音
PS C:\> Get-Process | Select-Object -First 5 Name, Id, CPU

# 2. 增加计算列,把字节换算成 MB
PS C:\> Get-ChildItem C:\Logs -File | Select-Object Name, Length, @{Name='MB';Expression={[math]::Round($_.Length/1MB,2)}}

# 3. 展开属性,得到纯字符串而不是包装对象
PS C:\> Get-Service | Select-Object -ExpandProperty Name

# 4. 按属性去重,再排序输出
PS C:\> Get-Process | Select-Object -Property Name, Id -Unique | Sort-Object Name

# 5. 跳过前 5 条再取 5 条,适合分页式查看
PS C:\> Get-ChildItem C:\Logs -File | Sort-Object Length -Descending | Select-Object -Skip 5 -First 5 Name, Length

# 6. 7.x 差异:排除末尾 2 条,保留前面的结果
PS C:\> Get-ChildItem C:\Logs -File | Select-Object -SkipLast 2 -Property Name, Length

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. Select-Object -First 5 和 Select-Object -Last 5 对上游管道的影响有什么不同?
  2. 为什么 Get-Process | Select-Object Name | ForEach-Object { $_.Kill() } 会失败?
  3. 计算属性里的 $_ 指什么?-ExpandProperty 和普通 -Property 有什么区别?
答案
  1. -First 达到数量后停止上游;-Last 需要缓冲全部输入,内存占用更高。
  2. 选择属性后得到 PSCustomObject,不再是 Process 对象,Kill() 方法不存在。
  3. $_ 是当前输入对象;-ExpandProperty 直接输出属性值,普通 -Property 输出包含该属性的新对象。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令