如何轻松地使用linq删除多个进程

时间:2012-09-25 20:40:32

标签: c# linq

我可以说两个过程:记事本和taskmgr打开。我想杀死那两个或更多的进程我该怎么做? 到目前为止,我通过谷歌搜索得出这个:

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

不确定如何区分上述两个流程?

6 个答案:

答案 0 :(得分: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添加到这些进程名称。

答案 1 :(得分:3)

创建一个包含要杀死的进程的列表或数组,然后检查列表中的进程名称

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

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

One Liner,在答案中被删除了:

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

答案 2 :(得分:2)

你想这样做吗?

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

如果我是你,我会做的就是一次只做一个名字。对于阅读代码的人来说,理解起来要容易得多。

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();
        }
    }
}

答案 3 :(得分: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 ) )...

或集合上的其他各种连接操作。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您有要杀死的进程列表,则可以使用Contains,因为执行p => p.ProcessName == "notepad,taskmgr"将无效(没有进程将使用“notepad,taskmgr”这个名称,添加一个逗号没有特别的意义)

所以请尝试类似

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

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