【问题标题】:Kill some processes by .exe file name通过 .exe 文件名杀死一些进程
【发布时间】:2011-03-21 16:42:39
【问题描述】:

如何通过在 C# .NET 或 C++ 中搜索它们的 .exe 文件名来终止某些活动进程?

【问题讨论】:

标签: c# c++ process exe kill-process


【解决方案1】:

我的解决方案是使用Process.GetProcess() 列出所有进程。

通过过滤它们以包含我想要的进程,然后我可以运行Process.Kill() 方法来停止它们:

var chromeDriverProcesses = Process.GetProcesses().
    Where(pr => pr.ProcessName == "chromedriver"); // without '.exe'
    
foreach (var process in chromeDriverProcesses)
{
     process.Kill();
}

更新:

如果您想以 异步 方式(使用 C# 8 Async Enumerables)执行相同操作,请查看:

const string processName = "chromedriver"; // without '.exe'
await Process.GetProcesses()
             .Where(pr => pr.ProcessName == processName)
             .ToAsyncEnumerable()
             .ForEachAsync(p => p.Kill());

注意:使用async 方法并不总是意味着代码会运行得更快。
主要好处是前台线程在运行时会被释放。

【讨论】:

  • 你可以使用 Contains 而不是 equal
  • 有趣的巧合是,我在这个线程中寻找杀死 chromedriver 的解决方案。一定是常见问题。
  • 这里也一样。这似乎并没有解决它。被触发的初始控制台实际上是 chrome.exe 的一个实例,我猜你不想强制关闭所有这些,除非它是构建/测试代理
【解决方案2】:

您可以杀死 MS Word 的特定实例。

foreach (var process in Process.GetProcessesByName("WINWORD"))
{
    // Temp is a document which you need to kill.
    if (process.MainWindowTitle.Contains("Temp")) 
        process.Kill();
}

【讨论】:

    【解决方案3】:

    如果您有进程 ID (PID),您可以按如下方式终止该进程:

    Process processToKill = Process.GetProcessById(pid);
    processToKill.Kill();
    

    【讨论】:

      【解决方案4】:
      public void EndTask(string taskname)
      {
            string processName = taskname.Replace(".exe", "");
      
            foreach (Process process in Process.GetProcessesByName(processName))
            {
                process.Kill();
            }
      }
      
      //EndTask("notepad");
      

      总结:无论名称中是否包含.exe,进程都会结束。您不需要“从进程名称中删除 .exe”,它可以 100% 工作。

      【讨论】:

      • 一个简单的.Replace(".exe", "") 在投票最多的答案中可以用更少的复杂和不必要的代码来做到这一点
      • 它的整个想法是查看带有或不带有 .exe 的方法,以便人们可以看到多种处理它的方法......它不适合复制和粘贴......
      • 如果名称实际上包含“.exe”,则这将不起作用,例如“my.exeption.exe” 或者,您可以检查最后四个字符的子字符串。尽管对于带有“my.exe.exe”的名称,这又会失败。只是指出来。
      【解决方案5】:

      快速回答:

      foreach (var process in Process.GetProcessesByName("whatever"))
      {
          process.Kill();
      }
      

      (从进程名称中去掉 .exe)

      【讨论】:

      • 以上代码返回异常(32位进程无法访问64位进程的模块)怎么办?
      • 去掉“.exe”。来自 MSDN:“进程名称是进程的友好名称,例如 Outlook,不包括 .exe 扩展名或路径”
      • @AgainMe Process.Kill() 向进程发送终止信号,该进程将停止其执行,无论它发生在哪里。这与中断信号不同,因为进程将没有机会响应和/或清除信号。该进程将不再执行,并且该进程使用的资源上的任何锁定都将被释放。 Environment.Exit() 由当前正在执行的进程执行,以使用成功代码杀死自己,这是非常安全的。 Process.Kill() 不如 Environment.Exit() 安全。
      • 我建议使用LINQ: var procs = Process.GetProcesses().Where(pr => pr.ProcessName.Contains("Spotify"));
      • 有什么选项可以杀死一个进程的特定实例?我的意思是,Contains("Spotify")) 会杀死 Spotify 的所有实例。 我想杀死 Spotify 的特定实例。
      【解决方案6】:

      您可以使用Process.GetProcesses() 获取当前正在运行的进程,然后使用Process.Kill() 杀死一个进程。

      【讨论】:

      • Process.GetProcessesByName 会简化这一点。
      • 以上代码返回异常(32位进程无法访问64位进程的模块)怎么办?
      猜你喜欢
      • 2014-11-24
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多