如何正确检查进程是否正在运行并停止它

时间:2015-02-12 15:49:50

标签: powershell

确定进程是否正在运行的正确方法是什么,例如FireFox,并停止它?

我做了一些环顾四周,我找到的最好的方法是:

if((get-process "firefox" -ea SilentlyContinue) -eq $Null){ 
        echo "Not Running" 
}

else{ 
    echo "Running"
    Stop-Process -processname "firefox"
 }

这是理想的做法吗?如果没有,这样做的正确方法是什么?

5 个答案:

答案 0 :(得分:68)

你这样做的方式是你要两次查询这个过程。林恩也首先提出了一个很好的观点。我可能会尝试以下内容:

# get Firefox process
$firefox = Get-Process firefox -ErrorAction SilentlyContinue
if ($firefox) {
  # try gracefully first
  $firefox.CloseMainWindow()
  # kill after five seconds
  Sleep 5
  if (!$firefox.HasExited) {
    $firefox | Stop-Process -Force
  }
}
Remove-Variable firefox

答案 1 :(得分:8)

如果您不需要显示确切的结果"运行" /"没有跑步",你可以简单地说:

ps notepad -ErrorAction SilentlyContinue | kill -PassThru

如果流程未运行,您将无法获得任何结果。如果它正在运行,您将收到get-process输出,并且该过程将停止。

答案 2 :(得分:1)

@ jmp242-通用text类型不包含System.Object方法,但是在收集CloseMainWindow变量时静态转换System.Diagnostics.Process类型对我有用。下面是采用这种强制转换的新代码(来自this answer)(并且更改为使用ProcessList进行循环)。

ForEach-Object

答案 3 :(得分:0)

谢谢@Joey。这就是我要找的东西。

我只是带来了一些改进:

  • 考虑多个流程
  • 以避免在所有进程终止时达到超时
  • 将整体打包成函数
function Stop-Processes {
    param(
        [parameter(Mandatory=$true)] $processName,
                                     $timeout = 5
    )
    $processList = Get-Process $processName -ErrorAction SilentlyContinue
    if ($processList) {
        # Try gracefully first
        $processList.CloseMainWindow() | Out-Null

        # Wait until all processes have terminated or until timeout
        for ($i = 0 ; $i -le $timeout; $i ++){
            $AllHaveExited = $True
            $processList | % {
                $process = $_
                If (!$process.HasExited){
                    $AllHaveExited = $False
                }                    
            }
            If ($AllHaveExited){
                Return
            }
            sleep 1
        }
        # Else: kill
        $processList | Stop-Process -Force        
    }
}

答案 4 :(得分:0)

从进程终止开始,这里python,我的 2 美分:

Get-Process python3.9|Stop-Process