我有一个脚本,我停止(杀死)一个进程。紧接着,我想要一些代码检查进程是否确实停止了,如果没有,退出脚本(如果它确实停止了,脚本当然会继续。)这是我试图这样做的方法:< / 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
行之间的竞争条件,还是逻辑缺陷? (如果是的话,有什么问题?)
答案 0 :(得分:3)
尝试使用if条件:
if (Get-Process "notepad" -ErrorAction SilentlyContinue | Where-Object {-not $_.HasExited })
答案 1 :(得分:0)
我认为问题是你之后立即检查 。在进程有机会停止之前执行 if 语句。当您使用停止处理时,它会向命令发送停止信号并继续运行,它不会等待进程实际停止。尝试在Sleep 1
和Sleep .1
之间添加Stop-Process [...]
,甚至是if (Get-Process [...]
。给它一点时间终止,然后再检查它是否确实。