6

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

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)如果有一个或多个进程正在运行(即返回输出),该语句将评估为 $true,如果没有返回输出,则为 $false(我指定-ErrorAction SilentlyContinue了当没有找到该名称的程序时返回输出。)当我使用正在运行的程序(例如,“记事本”)运行此代码块时,它在测试中起作用,并且当我尝试不存在的程序(例如,“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行 evals 为 $true,并结束脚本。这只是Stop-Process行与后续Get-Process行之间的竞争条件,还是逻辑缺陷?(如果是这样,解决方法是什么?)

4

2 回答 2

3

试试这个 if 条件:

if (Get-Process "notepad" -ErrorAction SilentlyContinue | Where-Object {-not $_.HasExited }) 
于 2013-07-25T19:21:04.227 回答
0

我认为问题在于您此后也立即进行检查。if语句在进程有机会停止之前执行。当您使用Stop-Process时,它会向命令发送一个停止信号并继续前进,它不会等待进程实际停止。尝试在 and 之间添加,甚至Sleep 1添加。在检查它是否终止之前,请稍等片刻。Sleep .1Stop-Process [...]if (Get-Process [...]

于 2013-07-25T19:31:16.877 回答