当前位置: 首页 > 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学习之旅中取得成功!🚀 如有任何问题,随时提问!

http://www.xdnf.cn/news/538435.html

相关文章:

  • 相机Camera日志分析之十五:高通相机Camx 基于预览1帧的ConfigureStreams Usecase完整过程日志分析详解
  • 辅助驾驶平权与出海,Mobileye的双重助力
  • Cursor 模型深度分析:区别、优缺点及适用场景
  • IOS 创建多环境Target,配置多环境
  • GK的作用是什么?
  • C语言指针深入详解(三):数组名理解、指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组
  • opencascade如何保存选中的面到本地
  • 使用MCP驱动IDA pro分析样本
  • DV SSL证书管理主要有哪些功能?
  • C语言—字符函数和字符串函数
  • 如何实现从网页一键启动你的 Electron 桌面应用(zxjapp://)
  • pcie phy电气层(PCS)详解gen1、2 (rx)
  • 北斗卫星通讯终端的技术原理是什么
  • 2025-05-19 学习记录--Python-简易用户登录系统 + 计算天数
  • RAG策略
  • 第二章、IMU(Inertial Measurement Unit 惯性测量单元)
  • 包装可靠性测试【二】
  • C++寻位映射的奇幻密码:哈希
  • AtomicReference 和 volatile 的比较
  • C++--综合应用-演讲比赛项目
  • 让数据驱动增长更简单! ClkLog用户行为分析系统正式入驻GitCode
  • 【随手记】 Event Bus vs. Event Loop
  • 01、java方法
  • 【Python训练营打卡】day30 @浙大疏锦行
  • 盲盒APP开发——解锁盲盒经济无限可能
  • mapbox-gl强制请求需要accessToken的问题
  • Chromium 回调设计实战:BindOnce 与 BindRepeating 的最佳实践
  • 【css】【面试提问】css经典问题总结
  • Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
  • 嵌入式自学第二十四天