管道与对象
对象管道 vs 文本管道、Where-Object。
30 分钟
管道与对象
PowerShell 的 管道 传递的是 .NET 对象,不是 Bash 的纯文本行。每个 cmdlet 输出结构化对象,下游 cmdlet 直接读属性——这是与 linux-shell 最大的差异。
学习目标
- 理解对象管道 vs 文本管道
- 熟练使用
Where-Object、Select-Object、ForEach-Object - 能用管道过滤进程、端口与 API 响应
核心内容
对象 vs 文本
# Bash:文本行,需 awk/grep 切字段
# ps aux | grep java
# PowerShell:对象,直接访问属性
Get-Process | Where-Object { $_.ProcessName -eq "java" } |
Select-Object Id, ProcessName, CPU
管道中 $ 代表当前管道对象($_ 或 $PSItem)。
三大过滤 cmdlet
# Where-Object:过滤(类似 grep,但针对属性)
Get-NetTCPConnection | Where-Object { $_.LocalPort -in 8080, 3000 }
# Select-Object:选列、计算属性
Get-ChildItem deploy\scripts\*.ps1 |
Select-Object Name, Length, LastWriteTime
# ForEach-Object:逐条处理
1..3 | ForEach-Object { "step $_" }
简写:? = Where-Object,% = ForEach-Object,select = Select-Object。
实战:检查 CodeRoadMap 端口
8080, 3000 | ForEach-Object {
$port = $_
$conn = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue
[PSCustomObject]@{
Port = $port
Listen = [bool]$conn
PID = ($conn | Select-Object -First 1).OwningProcess
}
}
对应 Linux:ss -tlnp | grep -E '8080|3000'。
排序与导出
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
Invoke-RestMethod http://127.0.0.1:8080/api/tracks |
Select-Object -ExpandProperty slug
-ExpandProperty 把嵌套属性展平为字符串列表,便于比对。
练习
- 列出 CPU 占用前 5 的进程
- 用管道统计
content\课程下.md文件数量 - 检查 8080 与 3000 是否在监听,输出表格
小结
下一课变量与类型。