PowerShell如何检测指定启动的程序是否运行并实现关闭?
PowerShell检测程序运行状态与关闭的最优方案
一、检测程序是否运行
1. Get-Process基础检测
直接通过进程名判断程序状态,示例:
$isRunning = Get-Process -Name "targetApp" -ErrorAction SilentlyContinue if ($isRunning) { Write-Host "程序已在运行" } else { Write-Host "程序未运行,启动中..." & ".\runProgram.cmd" }
要点:-Name参数可省略.exe后缀,-ErrorAction SilentlyContinue避免程序未运行时抛出错误。
2. 精准匹配(解决同名进程问题)
如果存在同名但启动参数不同的进程,可结合进程命令行参数做精准过滤:
$targetProcess = Get-CimInstance Win32_Process | Where-Object { $_.Name -eq "targetApp.exe" -and $_.CommandLine -like "* -s -c*" } if ($targetProcess) { Write-Host "符合参数要求的程序实例已运行" } else { & ".\runProgram.cmd" }
Get-Process的局限:无法直接获取进程的命令行参数,因此需要用Get-CimInstance Win32_Process(WMI的现代替代)来实现精准匹配。
二、关闭程序的方法
优雅关闭(优先推荐)
模拟用户点击关闭按钮,避免强制终止导致数据丢失:
$process = Get-Process -Name "targetApp" -ErrorAction SilentlyContinue if ($process) { $closedSuccessfully = $process.CloseMainWindow() if (-not $closedSuccessfully) { # 优雅关闭失败时再强制终止 $process.Kill() } # 等待进程退出,超时5秒 $process.WaitForExit(5000) }
强制终止(仅必要时使用)
直接终止无响应的程序,示例:
Get-Process -Name "targetApp" -ErrorAction SilentlyContinue | Stop-Process -Force
更简洁的写法:
Stop-Process -Name "targetApp" -Force -ErrorAction SilentlyContinue
三、两种方案的整合脚本
方案1:执行任务后关闭程序
# 执行自动化工作流任务 Write-Host "执行工作流任务..." # 任务完成后关闭程序 $process = Get-Process -Name "targetApp" -ErrorAction SilentlyContinue if ($process) { if (-not $process.CloseMainWindow()) { $process.Kill() } $process.WaitForExit(3000) }
方案2:启动前检查并按需启动
# 检查带指定参数的进程是否运行 $targetProcess = Get-CimInstance Win32_Process | Where-Object { $_.Name -eq "targetApp.exe" -and $_.CommandLine -match "-s\s+-c" } if (-not $targetProcess) { Write-Host "程序未运行,启动runProgram.cmd..." & ".\runProgram.cmd" # 可选:等待程序加载完成 Start-Sleep -Seconds 5 } # 执行自动化工作流任务 Write-Host "执行工作流任务..."
关键注意事项
- 进程名要准确:通过任务管理器“详细信息”标签确认进程的真实名称(部分程序的进程名可能与.exe文件名不同)。
- 权限匹配:如果程序以管理员身份运行,PowerShell脚本也需要管理员权限才能检测/关闭进程。
- 参数匹配灵活调整:根据
runProgram.cmd里的实际参数格式,修改Where-Object中的匹配规则(比如-like或-match)。
内容的提问来源于stack exchange,提问作者me9hanics
相关产品推荐
相关产品推荐

