PowerShell双While循环监控脚本异常问题求助
问题分析与解决方案
问题根源
- 嵌套逻辑错误:Edge运行时仍会检查PowerShell脚本进程,而脚本完成打开Edge的任务后会自动退出,导致脚本被反复重启。
Wait-Process -Name msedge用法错误:该命令是等待Edge进程终止,而非等待脚本启动Edge;若脚本启动Edge后自行退出,这个命令会一直阻塞到Edge关闭,破坏监控逻辑。- 进程筛选不精准:未区分运行
SAPTestScripting.ps1的PowerShell进程,可能误判其他无关的PowerShell窗口。
修正后的脚本
$scriptPath = "C:\Temp\SAPTestScripting.ps1" while ($true) { # 检查是否有可见的Edge进程 $hasVisibleEdge = Get-Process msedge -ErrorAction Ignore | Where-Object { $_.MainWindowTitle } if ($hasVisibleEdge) { # Edge正在运行,暂停PowerShell脚本监控,等待后重新检查 Start-Sleep -Seconds 5 continue } # Edge未运行,检查目标PowerShell脚本进程是否存在 $scriptProcess = Get-Process powershell, pwsh -ErrorAction Ignore | Where-Object { $_.MainWindowTitle -and (Get-CimInstance Win32_Process -Filter "ProcessId = $($_.Id)").CommandLine -match [regex]::Escape($scriptPath) } if (-not $scriptProcess) { # 启动目标脚本,并等待脚本进程执行完成 $startedProcess = Start-Process powershell -ArgumentList "-File `"$scriptPath`"" -PassThru Wait-Process -Id $startedProcess.Id } Start-Sleep -Seconds 3 }
脚本逻辑说明
- Edge优先级监控:每次循环先检查是否有可见的Edge窗口,若存在则直接进入等待,不再处理PowerShell脚本的监控,符合「Edge运行时暂停PowerShell进程监控」的需求。
- 精准筛选脚本进程:通过
Win32_Process获取进程的命令行参数,精准匹配运行SAPTestScripting.ps1的PowerShell/pwsh进程,避免误判其他无关PowerShell窗口。 - 正确的进程等待:启动脚本时通过
-PassThru获取进程对象,等待该脚本进程完成(而非等待Edge),确保脚本执行完成后再进入下一轮检查。 - 循环逻辑闭环:Edge未运行时,若脚本进程不存在则启动并等待其完成;若脚本进程存在则继续等待,直到Edge启动或脚本进程结束。
内容的提问来源于stack exchange,提问作者LILDASHIEGRINGO
相关产品推荐
相关产品推荐

