2012-09-25 20 views
0

我可以说两个进程:记事本和taskmgr打开。我想杀死那两个或更多的进程,我该怎么做? 到目前为止,我想出了这个由谷歌搜索周围:如何使用linq轻松删除多个进程

Process.GetProcesses().Where(p => p.ProcessName == "notepad,taskmgr").ToList().ForEach(y => y.Kill()); 

不知道如何上述两个过程之间区别?

回答

5

linq查询看起来只是在名称为“notepad,taskmgr”时才找到进程。两者都要,使用这样的查询:

Process.GetProcesses().Where(p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr").ToList().ForEach(y => y.Kill()); 

如果你要增加更多的流程,你可能想要做这样的事情:

var processNamesToKill = new List<string> { "notepad", "taskmgr", "someotherprocess" }; 
Process.GetProcesses().Where(p => processNamesToKill.Contains(p.ProcessName)).ToList().ForEach(y => y.Kill()); 

您可以再添加其他进程到那个清单。至于搞清楚你发现了哪些东西,在你的ForEach中,你可以通过y.ProcessName访问名字,并在需要的地方使用它。

编辑:将.exe添加到那些进程名称(如果需要的话)。

3

创建一个列表或数组与流程被杀害,然后检查列表中过程

List<string> killme = new List<string> { "notepad", "taskmgr" } 

Process.GetProcesses().Where(p => killme.Contains(p.ProcessName)).ToList().ForEach(y => y.Kill()); 

一个衬片的名字,这是一个答案被删除:

Process.GetProcesses().Where(p => new[] {"notepad", "taskmgr"}.Contains(p.ProcessName)).ToList().ForEach(y => y.Kill()); 
+0

这是做到这一点的最好方法是什么?是否有单线解决方案?我猜对不对? – NoviceMe

+0

我会建议一个字符串集而不是'List',但这只是我 –

+0

@NoviceMe有人发表了一个解决方案,其中一个数组是在linq语句中构建的,但我会认为这是更具可读性的 – msmucker0527

2

你想要做到这一点吗?

Process.GetProcesses().Where(p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr") 
    .ToList().ForEach(y => y.Kill()); 

我会做什么,如果我是你,将一次只做1个名字。任何阅读代码的人都会更容易理解。

class Program 
{ 
    static void Main(string[] args) 
    { 
     killProcess("notepad.exe"); 
     killProcess("taskmgr"); 
    } 

    public static void killProcess(string name) 
    { 
     foreach (Process process in Process.GetProcessesByName(name)) 
     { 
      process.Kill(); 
     } 
    } 
} 
+0

我会认为'killAllProccesses(IEnumerable processesToKill)'方法对消费者来说是相当可读的。 – Servy

+0

@Servy是另一种连接它的方式。尽管如此,我仍然不会在linq命令中全力推广。 –

+0

我会使用[一个真正的foreach循环](http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx),但使用“Where”作为其他的有没有一个可怕的想法。 – Servy

0

,如果你的LINQ的其他作品,这其中应该只是像

... Where(p => p.ProcessName == "notepad" || p.ProcessName == "taskmgr") ... 

否则,你可能想使一组进程名杀死的,像

var set = new HashSet<string>() { "notepad.exe", "taskmgr.txt", "someotherthing.exe" }; 
... linq .. Where(p=> set.Contains(p.ProcessName))... 

或该集合上的其他各种联合操作。

0
 var processesToKill = new [] {"notepad", "iexplorer"}; 
     var processes = Process.GetProcesses().Where(p => processesToKill.Contains(p.ProcessName)).ToList(); 
     processes.ForEach(p => p.Kill()); 
0

如果你有,你想杀死进程的列表,你可以使用Contains,因为这样做p => p.ProcessName == "notepad,taskmgr"将无法​​正常工作(没有进程将有名为“记事本,taskmgr”,添加一个逗号没有特殊意)

因此,而不是尝试像

var processesToKill = new Collection<string> { "notepad", "taskmgr" }; 

foreach (var process in Process.GetProcesses().Where(p => processesToKill.Contains(p))) 
{ 
    process.Kill(); 
} 
相关问题