2015-02-05 79 views
1

首先我會強調我是Powerhell的新手。在PowerShell中停止多個進程

我試圖阻止兩個進程的所有實例,我已經編寫並在PowerShell中運行下面,但它實際上給我一個BSOD,所以我一定做了一些相當愚蠢的事情。

任何人都可以指出我出錯的地方嗎?

$processes = Get-Process 
    foreach ($process in $processes) 
    { 
    if($process.ProcessName -eq "chrome" -or "chromedriver") 
    { 
     $process | Stop-Process -Force 
    } 

} 
+0

arco444打我給它,但如果你'echo'什麼你'別-Process'ing,或添加一個'-confirm '標籤到'停止過程'你會看到它。自由使用打印語句是學習新語言的關鍵。 – meatspace 2015-02-05 16:30:06

回答

1

你需要做到以下幾點:

if(($process.ProcessName -eq "chrome") -or ($process.ProcessName -eq "chromedriver")) 
{ 
    $process | Stop-Process -Force 
} 

否則你說if(some_condition -or true),其結果將總是爲true,所以你通過你的列表殺死所有進程!

字符串不是空值,PowerShell會將其解釋爲true。您可以通過在控制檯中進行測試:

[PS] > $null -or $null 
False 
[PS] > $null -or "abc" 
True 
+0

非常感謝! – user3451887 2015-02-05 16:39:58

0

我也是新的PowerShell但試試這個:

get-process | where-object { $_.Name -eq "chrome" -or $_.Name -eq "chromedriver" } | stop-process -force 

我停止過程-WhatIf嘗試過了,它看起來不錯的地雷。我在Windows 8.1中使用PowerShell ISE

1

與Arco444有關的if語句解釋的邏輯是正確的。條件獨立評估和非空非空字符串爲真值與塑像作爲[bool]

[bool]"chromedriver" 

另一種方式來處理,這可能是使用-contains。如果你有幾件事要檢查一個值。

If("chrome","chromedriver" -contains $process.ProcessName){ 
    $process | Stop-Process -Force 
} 

更好的是過濾你正在返回的過程,因爲你只是在尋找某些特定的過程。對於支持它的cmdlet,-WhatIf也可以用於調試。

Get-Process "chrome","chromedriver" | Stop-Process -Force -WhatIf 
0
Get-Process chromedriver | Stop-Process -Force 

這爲我做...