📌 PowerShell 对象处理与筛选

核心理念:PowerShell中一切皆对象,命令输出的是结构化.NET对象而非纯文本

一、对象基础概念

1. 什么是对象?

  • 包含属性(数据特征)和方法(可执行操作)的数据结构
  • 查看对象结构
    Get-Process | Get-Member  # 显示所有属性和方法
    

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 查看对象结构(属性/方法)
posted @ 2025-06-29 19:24  kyle_7Qc  阅读(155)  评论(0)    收藏  举报