当前位置: 首页 > news >正文

学习黑客 PowerShell 详解

PowerShell 详解:管道、过滤和常用命令技术指南 🚀

作者: 海尔辛 | 发布时间: 2025-05-19 12:18:38 UTC

📋 目录

  1. PowerShell 管道详解
  2. 文本搜索与过滤
  3. 结果限制与选择
  4. 比较和条件操作符
  5. 格式化输出
  6. 对象操作与属性访问
  7. 错误处理
  8. 综合实例与最佳实践

1. PowerShell 管道详解

PowerShell 的管道操作符 | 是其最强大的特性之一,但与传统 Shell 的不同之处在于,PowerShell 传递的是对象而非纯文本。

🔹 管道基础

# 基本管道语法
Command1 | Command2 | Command3# 实际示例:获取进程并按内存使用排序
Get-Process | Sort-Object -Property WorkingSet -Descending

🔹 管道工作原理

在 PowerShell 中:

  1. 左侧命令将完整对象传递给右侧命令
  2. 右侧命令对这些对象进行处理,而不仅仅是文本
# 这个命令会传递Process对象,不只是进程名
Get-Process | Where-Object { $_.CPU -gt 50 }

🔹 $_$PSItem

这两个变量在管道中表示"当前对象",它们是完全等价的:

# 使用 $_ (更常见)
Get-Service | Where-Object { $_.Status -eq "Running" }# 使用 $PSItem (更具可读性)
Get-Service | Where-Object { $PSItem.Status -eq "Running" }

🔹 管道链式命令示例

# 找出占用CPU最高的5个进程的名称和CPU使用率
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5 -Property Name, CPU

2. 文本搜索与过滤

PowerShell 中搜索文本不使用 findstr(CMD 命令),而是有多种专用命令。

🔹 Select-String (PowerShell 中的 grep/findstr)

# 在文件中搜索内容
Select-String -Path "C:\logs\*.log" -Pattern "error"# 搜索多个文件类型
Get-ChildItem -Path C:\Scripts -Filter *.* -Recurse | Select-String -Pattern "password" | Format-List Path, Line

🔹 文本过滤的高级用法

# 使用正则表达式
Select-String -Path "C:\logs\app.log" -Pattern "\b\d{3}-\d{2}-\d{4}\b" # 查找SSN格式的内容# 查找并显示周围上下文
Select-String -Path "C:\logs\app.log" -Pattern "critical error" -Context 2,2 # 显示匹配行上下2行# 忽略大小写(默认已忽略)
Select-String -Path "file.txt" -Pattern "ERROR" -CaseSensitive # 仅匹配大写

🔹 与 Where-Object 结合过滤

# 过滤文本内容
Get-Content "C:\logs\app.log" | Where-Object { $_ -match "error" }# 过滤包含特定文本的文件
Get-ChildItem -Path C:\Scripts -Recurse | Where-Object { $_.Extension -eq ".ps1" -and (Get-Content $_.FullName | Select-String "Administrator") }

3. 结果限制与选择

控制命令输出数量和范围的命令。

🔹 Select-Object 限制

# 获取前N项元素 (-First)
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5# 获取后N项元素 (-Last)
Get-EventLog -LogName System -Newest 100 | Select-Object -Last 10# 跳过前N项元素 (-Skip)
Get-ChildItem | Select-Object -Skip 5# 结合使用Skip和First选择范围
Get-Process | Select-Object -Skip 10 -First 5  # 选择第11-15个进程

🔹 限制 Get 命令的返回结果

许多 Get 命令有内置限制参数:

# 直接限制获取项目数
Get-EventLog -LogName Application -Newest 20# 使用 -MaxEvents 参数
Get-WinEvent -LogName System -MaxEvents 10# 获取文件前N行
Get-Content -Path "C:\logs\large.log" -TotalCount 50# 获取文件后N行
Get-Content -Path "C:\logs\large.log" -Tail 50

🔹 调整 ForEach-Object 处理

# 处理前100个对象后停止
$count = 0
Get-ChildItem -Recurse | ForEach-Object {$count++if ($count -gt 100) { break }$_.FullName
}

4. 比较和条件操作符

PowerShell 中的比较操作符具有独特特性。

🔹 比较操作符

操作符描述示例
-eq等于$a -eq 5
-ne不等于$a -ne 0
-gt大于$a -gt 10
-ge大于等于$a -ge 10
-lt小于$a -lt 20
-le小于等于$a -le 20
-like通配符匹配$name -like "J*"
-notlike通配符不匹配$name -notlike "J*"
-match正则表达式匹配$text -match "^\d{3}-\d{2}-\d{4}$"
-notmatch正则表达式不匹配`$text -notmatch "error
-contains集合包含值$array -contains "value"
-notcontains集合不包含值$array -notcontains "value"
-in值在集合中"value" -in $array
-notin值不在集合中"value" -notin $array

🔹 逻辑操作符

# 逻辑AND
Get-Process | Where-Object { $_.CPU -gt 10 -and $_.WorkingSet -gt 50MB }# 逻辑OR
Get-Service | Where-Object { $_.Status -eq "Running" -or $_.Name -like "win*" }# 逻辑NOT
Get-Service | Where-Object { -not ($_.Status -eq "Running") }
# 等同于
Get-Service | Where-Object { $_.Status -ne "Running" }

🔹 通配符和正则表达式

# 通配符例子 (*表示任意多个字符,?表示任意单个字符)
Get-ChildItem -Path C:\Windows\*.exe
Get-Process | Where-Object { $_.Name -like "w*" }# 正则表达式例子
Get-Process | Where-Object { $_.Name -match "^w.*d$" } # 以w开头,d结尾
Get-ChildItem | Where-Object { $_.Name -match "\d{4}" } # 包含4个连续数字

5. 格式化输出

格式化命令能控制PowerShell输出的显示方式。

🔹 基本格式化命令

# 表格格式(默认)
Get-Process | Format-Table# 列表格式(详细)
Get-Process -Name svchost | Format-List# 网格视图(交互)
Get-Process | Out-GridView# 宽表格格式(更多列)
Get-Process | Format-Wide -Property Name -Column 4

🔹 自定义格式化

# 选择特定列显示
Get-Process | Format-Table Name, ID, CPU, WorkingSet# 计算属性(显示MB单位)
Get-Process | Format-Table Name, ID, @{Name="Memory(MB)"Expression={$_.WorkingSet / 1MB -as [int]}
}# 对列排序和分组
Get-Service | Sort-Object Status | Format-Table -GroupBy Status

🔹 导出和重定向

# 导出为CSV
Get-Process | Export-Csv -Path "processes.csv" -NoTypeInformation# 导出为JSON
Get-Process | ConvertTo-Json | Out-File "processes.json"# 导出为XML
Get-Process | Export-Clixml -Path "processes.xml"# 控制台和文件同时输出
Get-Process | Tee-Object -FilePath "processes.txt" -Append

6. 对象操作与属性访问

PowerShell处理的是对象而非纯文本,了解对象操作至关重要。

🔹 属性选择与过滤

# 选择特定属性
Get-Process | Select-Object Name, ID, CPU# 展开复杂属性
Get-WmiObject Win32_NetworkAdapter | Select-Object Name, @{Name="IPAddresses"Expression={$_.GetRelated("Win32_NetworkAdapterConfiguration").IPAddress}
}# 获取所有属性和方法
Get-Process | Get-Member

🔹 对象转换与操作

# 将对象转换为另一种类型
"42" -as [int]
[datetime]"2025-05-19"# 创建自定义对象
$obj = [PSCustomObject]@{Name = "Knightluozichu"Role = "PowerShell专家"Skills = "PowerShell", "安全", "自动化"
}# 遍历对象进行操作
Get-Process | ForEach-Object {$_.Name = $_.Name.ToUpper()$_
}

7. 错误处理

理解PowerShell的错误处理机制可以编写更健壮的脚本。

🔹 错误类型和处理

# 终止性错误 vs. 非终止性错误
Stop-Process -Name "NonExistentProcess" # 非终止性错误
Remove-Item "C:\NonExistentFolder\file.txt" -ErrorAction Stop # 转为终止性错误# 错误操作参数
# -ErrorAction SilentlyContinue (忽略错误继续)
Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue# -ErrorAction Stop (将非终止错误转为终止错误)
Get-Item "C:\NonExistentFile.txt" -ErrorAction Stop# -ErrorVariable (捕获错误到变量)
Get-Process -Name "NonExistentProcess" -ErrorVariable ProcessError
if ($ProcessError) { Write-Host "发生了错误: $ProcessError" }

🔹 Try/Catch/Finally

try {# 尝试执行的代码$result = 10 / 0  # 会产生除零错误
} catch [System.DivideByZeroException] {# 特定类型错误处理Write-Host "捕获到除零错误!"
} catch {# 其他任何错误处理Write-Host "发生了一个错误: $_"
} finally {# 无论是否发生错误都会执行Write-Host "清理资源..."
}

8. 综合实例与最佳实践

将前面所学概念组合使用的实际例子。

🔹 系统监控和报告

# 生成高内存进程报告
$highMemProcesses = Get-Process | Where-Object { $_.WorkingSet -gt 100MB } |Sort-Object WorkingSet -Descending |Select-Object -First 10 -Property Name, ID, @{Name="Memory(MB)"Expression={[math]::Round($_.WorkingSet / 1MB, 2)}}# 格式化输出并同时写入屏幕和文件
$highMemProcesses | Format-Table -AutoSize | Tee-Object -FilePath "C:\Reports\HighMemoryProcesses_$(Get-Date -Format 'yyyyMMdd').txt"

🔹 日志分析

# 搜索过去24小时的系统错误并生成摘要
$yesterday = (Get-Date).AddDays(-1)
$errors = Get-WinEvent -FilterHashtable @{LogName = 'System'Level = 2  # 错误级别StartTime = $yesterday
} -ErrorAction SilentlyContinue# 按来源分组并统计
$errorSummary = $errors | Group-Object -Property ProviderName | Select-Object @{Name="Source"Expression={$_.Name}}, @{Name="ErrorCount"Expression={$_.Count}} |Sort-Object ErrorCount -Descending# 输出统计和详情
"共发现 $($errors.Count) 个系统错误,按来源统计:"
$errorSummary | Format-Table -AutoSize"前5个最新错误详情:"
$errors | Select-Object -First 5 TimeCreated, ProviderName, Id, Message | Format-List

🔹 批量文件处理

# 在指定目录中查找并处理所有大于100MB的日志文件
$largeLogFiles = Get-ChildItem -Path "C:\Logs" -Filter "*.log" -Recurse |Where-Object { $_.Length -gt 100MB } |Sort-Object Length -Descending# 处理每个文件
foreach ($file in $largeLogFiles) {try {# 获取最近的错误行$errorLines = Get-Content $file.FullName -Tail 1000 | Select-String -Pattern "ERROR|CRITICAL|EXCEPTION" -Context 0,2if ($errorLines.Count -gt 0) {# 创建报告目录$reportDir = "C:\Reports\LogAnalysis"if (-not (Test-Path $reportDir)) {New-Item -Path $reportDir -ItemType Directory -Force | Out-Null}# 提取文件名并创建报告$reportName = "$reportDir\$($file.BaseName)_ErrorReport.txt"# 写入报告"文件: $($file.FullName)" | Out-File $reportName"大小: $([math]::Round($file.Length / 1MB, 2)) MB" | Out-File $reportName -Append"分析时间: $(Get-Date)" | Out-File $reportName -Append"发现错误数: $($errorLines.Count)" | Out-File $reportName -Append"详细错误:" | Out-File $reportName -Append$errorLines | Out-File $reportName -AppendWrite-Host "已为 $($file.Name) 创建错误报告:$reportName" -ForegroundColor Green}} catch {Write-Warning "处理文件 $($file.FullName) 时出错: $_"}
}

🔹 综合PowerShell最佳实践

  1. 管道优化

    • 尽早在管道中过滤数据,减少传递的对象数量
    • 使用Select-Object仅选择需要的属性,减小内存使用
  2. 命令规范化

    • 使用完整命令名称而非别名编写脚本(别名仅适用于交互式命令行)
    • 使用参数名称而非位置参数增强可读性
  3. 性能考虑

    • 处理大量对象时考虑使用ForEach-Object -Parallel(PowerShell 7+)
    • 使用-Filter参数而非Where-Object以在命令开始处过滤
  4. 脚本安全性

    • 总是验证和清理用户输入
    • 使用-WhatIf-Confirm参数进行危险操作

通过掌握这些PowerShell概念和技术,你能够更高效地执行系统管理任务,自动化繁琐操作,并构建强大的工具解决复杂问题。PowerShell真正的强大之处在于它将对象处理、.NET框架和灵活的脚本语言结合在一起,一旦掌握,你将拥有几乎无限的自动化能力。

祝你在PowerShell学习之旅中取得成功!🚀 如有任何问题,随时提问!

相关文章:

  • 远程医疗结合贴肤芯片技术对体育院校学生提升运动表现的路径分析
  • 详解Oracle HASH CHAIN和HASH BUCKET
  • PostgreSQL基本用法
  • 数据分析入门指南:从历史到实践
  • Linux详解基本指令(一)
  • HttpMessageConverter 的作用是什么? 它是如何实现请求体到对象、对象到响应体的自动转换的(特别是 JSON/XML)?
  • # YOLOv4:目标检测的全新突破
  • 特种作业操作证考试题库及答案(登高架设作业)
  • 【数据库】数据库故障排查指南
  • C++初阶-vector的底层
  • 计算机组织原理第一章
  • Android 11.0 动画缩放默认值改为0.5的功能实现
  • Spring Boot 接口定义指南:构建高效的RESTful API
  • 【工具使用】STM32CubeMX-片内Flash读写操作
  • 深入解析 Oracle session_cached_cursors 参数及性能对比实验
  • Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决
  • Linux-进程间通信
  • (C语言篇)处理字符串的四个基础函数
  • 一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(下)
  • Navicat连接开启sm3认证的瀚高数据库
  • 海军“吉祥方舟”号医院船开展海上卫勤演练
  • 中国旅游日|上天当个“显眼包”!体验低空经济的“飞”凡魅力
  • 《缶翁的世界》首发:看吴昌硕王一亭等湖州籍书画家的影响
  • 习近平向第三十四届阿拉伯国家联盟首脑理事会会议致贺信
  • 2025年“新时代网络文明公益广告”征集展示活动在沪启动
  • 赡养纠纷个案推动类案监督,检察机关保障特殊群体胜诉权