2015-02-12 18 views
22

Bir işlemin çalışıp çalışmadığını belirlemek için doğru yöntem nedir, örneğin FireFox ve durdurma? Bir İşlemin Çalıştırılıp Olmadığını Doğrulama ve Durdurma

yaptım bazı etrafa ve buldum iyi yolu bu idi:

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

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

bu bunu yapmanın ideal bir yol var mı? Değilse, bunu yapmak için doğru yol nedir?

+1

Kod bozuk mu k? –

+1

Evet öyle, ama bunu yapmak için ideal bir yol olup olmadığını bilmek istedim? Onların daha iyi bir yolu var mı? Bu şekilde yapmanın herhangi bir dezavantajı/avantajı var mı? –

+1

Bunu yapmak için bir kinder yolu, firefox penceresinin ana hwnd'sini almak ve bir WM_CLOSE ve/veya WM_QUIT göndermek olacaktır. Bu, hangi powershell yeteneğinin kapsamının ötesinde olabilir. –

cevap

37

Yaptığınız şekilde, işlemi iki kez sorgulıyorsunuz. Ayrıca Lynn ilk olarak güzel olmak için iyi bir nokta ortaya çıkarır. Muhtemelen gibi bir şey denemek istiyorum şu: Eğer kesin bir sonuç görüntülemek için gerekmiyorsa

# 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

Charles - İhtiyacınız olan şey tam budur. Not Joey'in [CloseMainWindow()] 'ı (https://msdn.microsoft.com/en-us/library/system.diagnostics.process.closemainwindow%28v=vs.110%29.aspx) yöntemini kullanın. Bu MSDN sayfasındaki dokümanları okuyun. Onun betiği, uygulamanın güzel bir şekilde çıkmasını istemek için çalışır ... sonra öldürmeye çalışır. Çok güzel Joey: +1. –

+0

Sadece söylemek üzereydim, aradığım şey buydu. –

+0

@CharlesWhitfield Evet, bunu cevap olarak işaretlerdim. Ve sen zaten sahipsin. –

3

"çalışan"/"runnuning değil", sadece olabilir:

ps notepad -ErrorAction SilentlyContinue | kill -PassThru 

süreç ise koşmuyordu, sonuç almayacaksınız. Çalışıyorsa, get-process çıktısı alırsınız ve işlem durdurulur.

+7

Kendim gibi yeni kullanıcı için 'Get-Process notepad -ErrorAction SilentlyContinue | Stop-Process -PassThru' –

0

Teşekkürler @Joey. Aradığım şey bu.

Ben sadece bazı iyileşmelere yol: tüm süreçlerin bir işlevde bütün paketlemek için

  • sonlandırıldı ne zaman

    • zaman aşımı ulaşmanızı önlemek için dikkate birden çok işlem
    • almaya

    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   
        } 
    } 
    
  • +0

    Bunun ile ilgili bir sorun, hatası aldığınız bir durumda sona erebilir HATA: Yöntem kapatılamadı çünkü [System.Object []] 'CloseMainWindow' adlı bir yöntem içermiyor. ancak $ processList | Stop-Process -Force çalışır. Bu hatayı düzgün bir şekilde nasıl kullanacağınızdan emin değilsiniz. – jmp242

    İlgili konular