You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写PowerShell脚本清理Windows重复进程仅保留1个运行实例

修复后脚本实现
# 定义要清理的目标进程名(无需带.exe后缀,模糊匹配可加*)
$targetProcessName = "wfshell*"

# 获取所有存活的目标进程,按启动时间升序排序(默认保留最早启动的实例)
$targetProcesses = Get-Process -Name $targetProcessName -ErrorAction SilentlyContinue | Sort-Object StartTime

# 仅当进程数大于1时才执行冗余清理
if ($targetProcesses.Count -gt 1) {
    # 跳过第一个(保留最早启动的实例),杀死其余进程
    $targetProcesses | Select-Object -Skip 1 | ForEach-Object {
        try {
            Stop-Process -Id $_.Id -Force -Confirm:$false -ErrorAction Stop
            Write-Host "已清理冗余进程:$($_.Name) (PID:$($_.Id))"
        } catch {
            Write-Warning "清理进程PID$($_.Id)失败:$($_.Exception.Message)"
        }
    }
}
关键改动说明
  • 提前判断进程实例数:只有匹配到的存活进程数量大于1时才执行清理逻辑,从根源避免误杀唯一实例
  • 改用Get-Process查询进程:相比原脚本的WMI查询会自动过滤已终止的无效进程条目,避免跨用户会话查询时的计数异常
  • 增加异常捕获:处理权限不足、进程已提前退出等边缘场景的报错
  • 可自定义保留规则:如果需要保留最新启动的实例,只需要把排序语句改成Sort-Object StartTime -Descending即可
定时执行场景优化建议

如果需要跨所有用户会话清理进程,运行脚本时需要获取管理员权限,可在脚本开头添加权限校验逻辑:

# 校验管理员权限
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Start-Process pwsh -ArgumentList "-File `"$($MyInvocation.MyCommand.Path)`"" -Verb RunAs
    exit
}

定时后台执行时可去掉日志输出相关语句,避免生成多余弹窗或日志。

内容的提问来源于stack exchange,提问作者JonathanV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:24:05