挑选属性、计算列或前后 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
PSCustomObject,原对象的方法会丢失;后续需要 Process 对象时要保留原对象或只取 Id 再查询。-First N 达到数量后会停止上游管道,上游的清理/统计可能不完整;-Last N 则必须读完全部输入,内存占用高。-ExpandProperty 遇到缺失属性会报错;属性是数组时会把每个元素展开成独立输出,行数可能变多。Expression 会报错,键名写错会得到空列;用 Name/Expression 或简写 n/e,并先在小结果上试。Select-Object * 会带出 PSPath、PSProvider 等附加属性,输出和原始对象不完全一样;需要干净字段时显式列出。Format-Table/Format-List 应放在管道末尾;它们生成格式化对象,再 Select-Object 或导出会得到意外结果。-SkipLast;需要跨版本时改用 -Skip/-First 组合,或先反转再取。Where-Object — 先按条件筛选再裁剪字段。Sort-Object — 排序后配合 -First/-Skip 取区间。ForEach-Object — 需要构造全新对象时更灵活。ConvertTo-Json — 把裁剪后的对象序列化。合上页面,先回答,再展开对照。
Select-Object -First 5 和 Select-Object -Last 5 对上游管道的影响有什么不同?Get-Process | Select-Object Name | ForEach-Object { $_.Kill() } 会失败?$_ 指什么?-ExpandProperty 和普通 -Property 有什么区别?-First 达到数量后停止上游;-Last 需要缓冲全部输入,内存占用更高。PSCustomObject,不再是 Process 对象,Kill() 方法不存在。$_ 是当前输入对象;-ExpandProperty 直接输出属性值,普通 -Property 输出包含该属性的新对象。
小程序版
微信扫码,随时查命令