2015-02-05 45 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 

这为我做...