核心理念:PowerShell中一切皆对象,命令输出的是结构化.NET对象而非纯文本
一、对象基础概念
1. 什么是对象?
2. 核心对象属性
| 属性 |
类型 |
说明 |
Id |
Int32 |
进程ID |
ProcessName |
String |
进程名称 |
CPU |
Double |
CPU占用时间(秒) |
WorkingSet |
Int64 |
内存占用量(字节) |
StartTime |
DateTime |
进程启动时间 |
二、核心对象处理Cmdlet详解
🔍 1. Select-Object - 属性选择器
功能
基本语法
command | Select-Object [-Property] <string[]> [-First] [-Last] [-Unique]
参数详解
| 参数 |
类型 |
说明 |
示例 |
-Property |
String[] |
指定要选择的属性(支持通配符*) |
Select-Object Name, CPU |
-ExcludeProperty |
String[] |
排除指定属性 |
Select-Object * -ExcludeProperty VM |
-First |
Int32 |
选择前N个对象 |
Select-Object -First 5 |
-Last |
Int32 |
选择最后N个对象 |
Select-Object -Last 3 |
-Unique |
Switch |
去除重复值 |
Select-Object ProcessName -Unique |
-Skip |
Int32 |
跳过前N个对象 |
Select-Object -Skip 10 |
| 计算属性语法 |
Hashtable |
@{Name="";Expression={}} 创建新计算属性 |
Select-Object @{Name="MB";Expression={$_.WS/1MB}} |
# 完整示例:选择前5进程并计算内存(MB)
Get-Process |
Select-Object -First 5 -Property Name,
@{Name="Mem(MB)";Expression={[math]::Round($_.WorkingSet/1MB, 2)}}
🔍 2. Where-Object - 条件过滤器
功能
基于条件筛选对象
基本语法
command | Where-Object { $_.Property -eq "Value" }
参数详解
| 语法形式 |
说明 |
最佳场景 |
| 脚本块模式 |
{ $_.Property -operator Value } 完整控制流 |
复杂条件 |
| 简化模式 |
Property -operator Value (PowerShell 3.0+) |
简单条件 |
| 比较运算符 |
-eq, -ne, -gt, -lt, -ge, -le, -like, -match |
所有场景 |
| 逻辑运算符 |
-and, -or, -not |
多条件组合 |
比较运算符详解
| 运算符 |
说明 |
示例 |
注意 |
-eq |
等于 |
$_.Status -eq "Running" |
不区分大小写 |
-ceq |
区分大小写等于 |
$_.Name -ceq "WinRM" |
精确匹配 |
-like |
通配符匹配 |
$_.Name -like "*svc*" |
支持*和?通配符 |
-match |
正则表达式匹配 |
$_.Path -match "\.exe$" |
使用正则表达式 |
-in |
包含于集合 |
$_.Id -in @(100, 200) |
PowerShell 3.0+ |
# 多条件筛选示例
Get-Service |
Where-Object {
$_.Status -eq "Running" -and
$_.StartType -eq "Automatic" -and
$_.Name -notlike "*#*"
}
🔍 3. Sort-Object - 数据排序
功能
对对象集合进行排序
基本语法
command | Sort-Object [-Property] <string> [-Descending]
参数详解
| 参数 |
类型 |
说明 |
示例 |
-Property |
String[] |
指定排序属性(支持多个属性) |
Sort-Object Name, CPU |
-Descending |
Switch |
降序排序(默认升序) |
Sort-Object WS -Desc |
-Unique |
Switch |
去除重复项 |
Sort-Object PID -Unique |
-CaseSensitive |
Switch |
区分大小写排序 |
Sort-Object Name -CaseSensitive |
# 多级排序示例
Get-ChildItem |
Sort-Object @{Expression={$_.Extension}; Ascending=$true},
@{Expression={$_.Length}; Descending=$true}
🔍 4. ForEach-Object - 对象处理器
功能
对每个管道对象执行操作
基本语法
command | ForEach-Object { 脚本块 }
参数详解
| 参数 |
类型 |
说明 |
示例 |
-Process |
ScriptBlock |
对每个对象执行的脚本块(主要参数) |
ForEach-Object { $_.Name } |
-Begin |
ScriptBlock |
在处理前执行的脚本块(初始化操作) |
ForEach-Object -Begin { $count=0 } |
-End |
ScriptBlock |
在处理后执行的脚本块(汇总操作) |
ForEach-Object -End {"Total: $count"} |
-MemberName |
String |
调用每个对象的方法或属性(PowerShell 4.0+) |
ForEach-Object -MemberName ToUpper |
# 完整处理流程示例
Get-Process |
ForEach-Object -Begin {
$totalMem = 0
"开始处理进程..."
} -Process {
$totalMem += $_.WorkingSet
"进程 $($_.Name) 使用内存: $($_.WorkingSet/1MB) MB"
} -End {
"总内存使用: $($totalMem/1GB) GB"
}
🔍 5. Group-Object - 数据分组
功能
按指定属性分组对象
基本语法
command | Group-Object [-Property] <string>
参数详解
| 参数 |
类型 |
说明 |
示例 |
-Property |
Object |
分组依据的属性或表达式 |
Group-Object Status |
-AsHashTable |
Switch |
返回哈希表而非分组对象 |
Group-Object Name -AsHashTable |
-AsString |
Switch |
将属性值视为字符串(非对象) |
Group-Object ProcessName -AsString |
-NoElement |
Switch |
不包含原始对象(仅统计信息) |
Group-Object Company -NoElement |
# 高级分组示例
Get-Process |
Group-Object @{Expression={$_.PriorityClass}} |
Select-Object Count, Name,
@{Name="TotalMem(GB)";Expression={($_.Group | Measure-Object WorkingSet -Sum).Sum / 1GB}}
🔍 6. Measure-Object - 数据统计
功能
计算对象的数值属性统计信息
基本语法
command | Measure-Object [-Property] <string> [-Sum] [-Average] [-Maximum] [-Minimum] [-Line] [-Word] [-Character]
参数详解
| 参数 |
类型 |
说明 |
示例 |
-Property |
String |
要统计的属性(默认:Length) |
Measure-Object -Property CPU |
-Sum |
Switch |
计算总和 |
Measure-Object -Sum |
-Average |
Switch |
计算平均值 |
Measure-Object -Average |
-Maximum |
Switch |
获取最大值 |
Measure-Object -Maximum |
-Minimum |
Switch |
获取最小值 |
Measure-Object -Minimum |
-StandardDeviation |
Switch |
计算标准差(PS6+) |
Measure-Object -StandardDeviation |
-AllStats |
Switch |
计算所有统计信息(PS6+) |
Measure-Object -AllStats |
# 完整统计示例
Get-ChildItem -File |
Measure-Object -Property Length -Sum -Average -Minimum -Maximum -StandardDeviation |
Select-Object Count,
@{Name="Size(MB)";Expression={[math]::Round($_.Sum/1MB, 2)}},
@{Name="Avg(MB)";Expression={[math]::Round($_.Average/1MB, 2)}},
Min, Max, StandardDeviation
三、组合应用实战(增强版)
案例1:内存占用Top 5进程(带完整属性)
Get-Process |
Where-Object {$_.WorkingSet -gt 100MB} |
Sort-Object WorkingSet -Descending |
Select-Object -First 5 -Property Name, Id,
@{Name="CPU(s)";Expression={$_.CPU}},
@{Name="Memory(MB)";Expression={[math]::Round($_.WorkingSet/1MB, 2)}},
@{Name="StartTime";Expression={$_.StartTime.ToString("yyyy-MM-dd HH:mm")}}
案例2:磁盘空间分析报告
Get-ChildItem -Path "C:\Projects" -Recurse -File |
Group-Object Extension -NoElement |
Sort-Object Count -Descending |
Select-Object @{Name="FileType";Expression={$_.Name}},
Count,
@{Name="Percentage";Expression={[math]::Round(($_.Count/$total)*100, 1)}} |
Export-Csv -Path "FileTypeReport.csv" -NoTypeInformation
案例3:服务状态监控仪表盘
$services = Get-Service
# 生成状态报告
$report = $services |
Group-Object Status, StartType -AsHashTable -AsString |
ForEach-Object {
[PSCustomObject]@{
Status = $_.Key[0]
StartType = $_.Key[1]
Count = $_.Value.Count
Examples = ($_.Value.Name | Select-Object -First 3) -join ", "
}
}
# 显示并导出
$report | Sort-Object Status, StartType | Format-Table -AutoSize
$report | Export-Clixml -Path "ServiceStatus.xml"
四、性能优化技巧
1. 高效过滤策略
# 优先使用原生过滤(比Where-Object快10倍)
Get-ChildItem -Filter *.log -Recurse # ✔️ 推荐
# 避免全量处理后再过滤
Get-Process | Where-Object {$_.Name -eq "chrome"} # ❌ 低效
Get-Process -Name "chrome" # ✔️ 高效
2. 属性选择优化
# 提前移除不需要的属性
Get-Service |
Select-Object Name, Status, DisplayName | # 减少后续管道负载
Where-Object Status -eq "Running"
3. 并行处理(PowerShell 7+)
# 使用ForEach-Object -Parallel加速处理
Get-ChildItem *.log |
ForEach-Object -Parallel {
$content = Get-Content $_.FullName
if ($content -match "ERROR") {
"Error found in: $($_.Name)"
}
} -ThrottleLimit 5
五、命令速查手册
| Cmdlet |
核心参数 |
使用频率 |
典型用例 |
Select-Object |
-Property, -First, -Skip, -Unique, 计算属性 |
⭐⭐⭐⭐⭐ |
选择特定属性/限制结果集 |
Where-Object |
-eq, -like, -match, -and, -or |
⭐⭐⭐⭐⭐ |
条件过滤 |
Sort-Object |
-Property, -Descending, -CaseSensitive |
⭐⭐⭐⭐ |
结果排序 |
ForEach-Object |
-Process, -Begin, -End, -Parallel |
⭐⭐⭐⭐⭐ |
遍历处理对象 |
Group-Object |
-Property, -AsHashTable, -NoElement |
⭐⭐⭐ |
数据分组 |
Measure-Object |
-Sum, -Average, -Min, -Max, -AllStats |
⭐⭐⭐ |
数值统计 |
💡 专业提示:使用 Get-Help <Cmdlet> -Full 查看完整参数文档,或 Get-Help <Cmdlet> -Examples 查看实用示例
总结:常用对象处理 Cmdlet 快速对照表
| Cmdlet |
功能描述 |
Select-Object |
选择属性、限制返回数量 |
Where-Object |
根据条件筛选对象 |
Sort-Object |
对对象排序 |
ForEach-Object |
对每个对象执行自定义操作 |
Get-Member |
查看对象结构(属性/方法) |