核心理念:PowerShell中一切皆對象,命令輸出的是結構化.NET對象而非純文本
一、對象基礎概念
1. 什么是對象?
2. 核心對象屬性
| 屬性 |
類型 |
說明 |
Id |
Int32 |
進程ID |
ProcessName |
String |
進程名稱 |
CPU |
Double |
CPU占用時間(秒) |
WorkingSet |
Int64 |
內存占用量(字節(jié)) |
StartTime |
DateTime |
進程啟動時間 |
二、核心對象處理Cmdlet詳解
?? 1. Select-Object - 屬性選擇器
功能
- 選擇對象屬性、限制輸出數量、創(chuàng)建計算屬性
基本語法
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={}} 創(chuàng)建新計算屬性 |
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" |
不區(qū)分大小寫 |
-ceq |
區(qū)分大小寫等于 |
$_.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 |
區(qū)分大小寫排序 |
Sort-Object Name -CaseSensitive |
# 多級排序示例
Get-ChildItem |
Sort-Object @{Expression={$_.Extension}; Ascending=$true},
@{Expression={$_.Length}; Descending=$true}
?? 4. ForEach-Object - 對象處理器
功能
對每個管道對象執(zhí)行操作
基本語法
command | ForEach-Object { 腳本塊 }
參數詳解
| 參數 |
類型 |
說明 |
示例 |
-Process |
ScriptBlock |
對每個對象執(zhí)行的腳本塊(主要參數) |
ForEach-Object { $_.Name } |
-Begin |
ScriptBlock |
在處理前執(zhí)行的腳本塊(初始化操作) |
ForEach-Object -Begin { $count=0 } |
-End |
ScriptBlock |
在處理后執(zhí)行的腳本塊(匯總操作) |
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 |
不包含原始對象(僅統(tǒng)計信息) |
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 - 數據統(tǒng)計
功能
計算對象的數值屬性統(tǒng)計信息
基本語法
command | Measure-Object [-Property] <string> [-Sum] [-Average] [-Maximum] [-Minimum] [-Line] [-Word] [-Character]
參數詳解
| 參數 |
類型 |
說明 |
示例 |
-Property |
String |
要統(tǒng)計的屬性(默認: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 |
計算所有統(tǒng)計信息(PS6+) |
Measure-Object -AllStats |
# 完整統(tǒng)計示例
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
三、組合應用實戰(zhàn)(增強版)
案例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:服務狀態(tài)監(jiān)控儀表盤
$services = Get-Service
# 生成狀態(tài)報告
$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"
四、性能優(yōu)化技巧
1. 高效過濾策略
# 優(yōu)先使用原生過濾(比Where-Object快10倍)
Get-ChildItem -Filter *.log -Recurse # ?? 推薦
# 避免全量處理后再過濾
Get-Process | Where-Object {$_.Name -eq "chrome"} # ? 低效
Get-Process -Name "chrome" # ?? 高效
2. 屬性選擇優(yōu)化
# 提前移除不需要的屬性
Get-Service |
Select-Object Name, Status, DisplayName | # 減少后續(xù)管道負載
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 |
??? |
數值統(tǒng)計 |
?? 專業(yè)提示:使用 Get-Help <Cmdlet> -Full 查看完整參數文檔,或 Get-Help <Cmdlet> -Examples 查看實用示例
總結:常用對象處理 Cmdlet 快速對照表
| Cmdlet |
功能描述 |
Select-Object |
選擇屬性、限制返回數量 |
Where-Object |
根據條件篩選對象 |
Sort-Object |
對對象排序 |
ForEach-Object |
對每個對象執(zhí)行自定義操作 |
Get-Member |
查看對象結構(屬性/方法) |