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

1zmg4dgp  于 10个月前  发布在  Shell
关注(0)|答案(5)|浏览(149)

判断一个进程是否正在运行(例如FireFox)并停止它的正确方法是什么?
我做了一些环顾四周,我发现最好的方法是这样的:

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

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

字符串
这是否理想的做法?若否,正确的做法是甚么?

cigdeys3

cigdeys31#

你这样做的方式是两次查询流程。此外,林恩提出了一个关于首先要友好的好观点。我可能会尝试以下内容:

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

字符串

gzjq41n4

gzjq41n42#

如果您不需要显示确切的结果“running”/“not runnuning”,您可以简单地:

ps notepad -ErrorAction SilentlyContinue | kill -PassThru

字符串
如果进程没有运行,你将不会得到任何结果。如果进程正在运行,你将收到get-process输出,并且进程将停止。

2jcobegt

2jcobegt3#

@jmp242 -泛型System.Object类型不包含CloseMainWindow方法,但在收集ProcessList变量时静态转换System.Diagnostics.Process类型对我来说很有效。下面是使用此转换(并将循环更改为使用ForEach-Object)的更新代码(来自this answer)。

function Stop-Processes {
    param(
        [parameter(Mandatory=$true)] $processName,
                                     $timeout = 5
    )
    [System.Diagnostics.Process[]]$processList = Get-Process $processName -ErrorAction SilentlyContinue

    ForEach ($Process in $processList) {
        # Try gracefully first
        $Process.CloseMainWindow() | Out-Null
    }

    # Check the 'HasExited' property for each process
    for ($i = 0 ; $i -le $timeout; $i++) {
        $AllHaveExited = $True
        $processList | ForEach-Object {
            If (-NOT $_.HasExited) {
                $AllHaveExited = $False
            }                    
        }
        If ($AllHaveExited -eq $true){
            Return
        }
        Start-Sleep 1
    }
    # If graceful close has failed, loop through 'Stop-Process'
    $processList | ForEach-Object {
        If (Get-Process -ID $_.ID -ErrorAction SilentlyContinue) {
            Stop-Process -Id $_.ID -Force -Verbose
        }
    }
}

字符串

dldeef67

dldeef674#

谢谢@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        
    }
}

字符串

46scxncf

46scxncf5#

从进程杀死开始,这里是python,我的2美分:

Get-Process python3.9|Stop-Process

字符串

相关问题