如何确保给定的流程不运行,&如果是,则终止脚本

时间:2013-07-25 19:04:06

标签: powershell

我有一个脚本,我停止(杀死)一个进程。紧接着,我想要一些代码检查进程是否确实停止了,如果没有,退出脚本(如果它确实停止了,脚本当然会继续。)这是我试图这样做的方法:< / p>

if (Get-Process "notepad" -ErrorAction SilentlyContinue) {
    Write-Host "Program still running somehow, terminating script..."
    exit
}
else
{ Write-Host "Program stopped." }

我以为我已经知道如果有一个或多个进程正在运行(即返回输出),语句(Get-Process "progname" -ErrorAction SilentlyContinue)将eval为$ true,如果没有返回输出则返回$ false(我指定了) -ErrorAction SilentlyContinue以确保在没有找到该名称的程序时返回没有输出。)当我使用正在运行的程序(例如,“notepad”)运行此代码块时,它可用于测试当我尝试一个不存在的程序时(比如说“notepadxxx”。)

但是,当我将它集成到我的大型程序中时,将其放在终止程序的行之后,如下:

Write-Host "Terminating Program..."
Stop-Process -Name "notepad" -Force
if (Get-Process "notepad" -ErrorAction SilentlyContinue) {
    Write-Host "Program still running somehow, terminating script..."
    exit
}
else
{ Write-Host "Program stopped." }

Get-Process行变为$ true,并结束脚本。这只是Stop-Process行和后续Get-Process行之间的竞争条件,还是逻辑缺陷? (如果是的话,有什么问题?)

2 个答案:

答案 0 :(得分:3)

尝试使用if条件:

if (Get-Process "notepad" -ErrorAction SilentlyContinue | Where-Object {-not $_.HasExited }) 

答案 1 :(得分:0)

我认为问题是你之后立即检查 。在进程有机会停止之前执行 if 语句。当您使用停止处理时,它会向命令发送停止信号并继续运行,它不会等待进程实际停止。尝试在Sleep 1Sleep .1之间添加Stop-Process [...],甚至是if (Get-Process [...]。给它一点时间终止,然后再检查它是否确实。