求Windows下可终止超阈值CPU/内存占用进程的PowerShell脚本
Windows PowerShell 脚本:终止高资源占用进程
以下是针对Windows环境的PowerShell脚本,可根据指定的CPU/内存阈值终止进程,适配RMM工具触发场景:
完整脚本
param( # CPU占用率阈值(相对于总CPU资源的百分比,例如90=90%总CPU) [int]$CpuThresholdPercent = 90, # 内存占用阈值(MB) [int]$MemoryThresholdMB = 2048, # 排除的进程名列表(避免终止系统关键进程) [array]$ExcludedProcessNames = @("svchost", "explorer", "winlogon", "csrss", "smss"), # 是否仅输出匹配进程而不终止(测试用) [switch]$WhatIf ) # 获取系统核心数,用于修正CPU使用率计算 $coreCount = [Environment]::ProcessorCount # 获取所有进程的实时CPU使用率 $cpuCounters = Get-Counter "\Process(*)\% Processor Time" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Where-Object { $_.InstanceName -notmatch "^(_total|idle)$" } | ForEach-Object { # 修正CPU使用率为总CPU百分比(进程原始CPU值/核心数) $correctedCpu = [math]::Round($_.CookedValue / $coreCount, 2) # 处理进程实例名(如chrome#1 → chrome) $processName = $_.InstanceName -replace "#\d+$", "" [PSCustomObject]@{ ProcessName = $processName CpuPercent = $correctedCpu } } # 获取所有进程的内存占用及进程ID $processes = Get-Process -ErrorAction SilentlyContinue | Select-Object Id, Name, @{Name="MemoryMB"; Expression={[math]::Round($_.WorkingSet64 / 1MB, 2)}} # 关联CPU和内存数据,筛选符合终止条件的进程 $targetProcesses = @() foreach ($cpuEntry in $cpuCounters) { $matchingProcesses = $processes | Where-Object { $_.Name -eq $cpuEntry.ProcessName } if ($matchingProcesses) { foreach ($proc in $matchingProcesses) { if ($proc.Name -notin $ExcludedProcessNames -and ($cpuEntry.CpuPercent -ge $CpuThresholdPercent -or $proc.MemoryMB -ge $MemoryThresholdMB)) { $targetProcesses += [PSCustomObject]@{ Id = $proc.Id Name = $proc.Name CpuPercent = $cpuEntry.CpuPercent MemoryMB = $proc.MemoryMB } } } } } # 去重(避免同一进程多次匹配) $targetProcesses = $targetProcesses | Select-Object Id, Name, CpuPercent, MemoryMB -Unique if ($targetProcesses.Count -eq 0) { Write-Host "未找到符合阈值条件的进程" exit 0 } Write-Host "找到符合终止条件的进程:" $targetProcesses | Format-Table -AutoSize # 终止进程 foreach ($proc in $targetProcesses) { try { $process = Get-Process -Id $proc.Id -ErrorAction Stop if ($WhatIf) { Write-Host "【测试模式】将终止进程:$($proc.Name) (ID: $($proc.Id))" } else { $process | Stop-Process -Force -ErrorAction Stop Write-Host "已成功终止进程:$($proc.Name) (ID: $($proc.Id))" } } catch { Write-Warning "无法终止进程 $($proc.Name) (ID: $($proc.Id)):$_" } }
关键说明
- CPU使用率修正:通过系统性能计数器获取实时CPU数据,自动根据核心数转换为总CPU百分比,避免多核心环境下的数值偏差
- 参数可定制:RMM工具可直接传入自定义阈值、排除进程列表,无需修改脚本本体
- 安全防护:默认排除系统关键进程,可通过
ExcludedProcessNames参数扩展保护范围 - 测试验证:添加
-WhatIf参数可预览待终止进程,避免误操作
使用注意事项
- 需以管理员权限运行脚本,否则无法终止部分系统进程
- RMM配置时需提前完成持续时长检测(脚本仅处理当前符合阈值的进程)
- 正式部署前建议用
-WhatIf参数在测试环境验证逻辑 - 可添加日志输出(如
Out-File -FilePath "C:\ProcessTermination.log" -Append)便于问题排查
内容的提问来源于stack exchange,提问作者Mario Lopez
相关产品推荐
相关产品推荐

