我有一个脚本,我在其中停止(杀死)一个进程。紧接着,我想要一些代码来检查进程是否确实停止了,如果没有,退出脚本(如果它确实停止了,脚本当然会继续。)这是我尝试这样做的方法:
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
行之间的竞争条件,还是逻辑缺陷?(如果是这样,解决方法是什么?)