Убить некоторые процессы по имени файла .exe

126

Как я могу убить некоторые активные процессы, выполнив поиск их имен файлов .exe в C # .NET или C ++?

Алиасгар Ягобзаде
источник
2
Если вам нужно убить процесс по частичному имени, см. Stackoverflow.com/questions/14632162/… .
Алексей Левенков

Ответы:

241

Быстрый ответ:

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

(оставьте .exe в имени процесса)

ConsultUtah
источник
2
что делать, если код выше возвращает исключение (32-битные процессы не могут получить доступ к модулям 64-битного процесса)?
Manish
40
Оставьте ".exe" выключенным. Из MSDN: «Имя процесса - это понятное имя для процесса, такого как Outlook, которое не включает расширение .exe или путь»
1
@AgainMe Process.Kill () отправляет сигнал уничтожения процессу, который останавливает его выполнение, где бы он ни находился. Это отличается от сигнала прерывания тем, что у процесса не будет возможности ответить и / или очистить сигнал. В этом процессе больше не будет выполняться, и любые блокировки ресурсов, используемых этим процессом, будут сняты. Environment.Exit () выполняется текущим выполняющимся процессом, чтобы убить себя с помощью кода успеха, что совершенно безопасно. Process.Kill () далеко не так безопасен, как Environment.Exit ().
jchitel
2
Я предлагаю использовать LINQ: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
Есть ли возможность убить конкретный экземпляр процесса? Я имею в виду, Contains("Spotify"))убивает все экземпляры Spotify. Я хочу убить конкретный экземпляр Spotify.
Banee Ishaque K
38

Мое решение - использовать Process.GetProcess () для вывода списка всех процессов.
Отфильтровав их, чтобы они содержали нужные мне процессы, я могу запустить метод Process.Kill (), чтобы остановить их:

var chromeDriverProcesses = Process.GetProcesses().
    Where(pr => pr.ProcessName == "chromedriver"); // without '.exe'

foreach (var process in chromeDriverProcesses)
{
     process.Kill();
}

Обновить:

Если вы хотите использовать asyncподход с некоторыми полезными недавними методами из 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
Леандро
10
Забавное совпадение, я искал в этой ветке решение для убийства хромодрайвера. Должно быть распространенная проблема.
kerl 09
Тоже самое. это, похоже, не решает эту проблему. Начальная консоль, которая запускается, на самом деле является экземпляром chrome.exe, и я предполагаю, что вы не хотите принудительно закрывать все из них, если это не агент сборки / тестирования
Дэн Чарпстер
16

Вы можете использовать Process.GetProcesses()для получения текущих запущенных процессов, а затем Process.Kill()для уничтожения процесса.

driis
источник
6
Process.GetProcessesByName упростит это.
ConsultUtah
что делать, если код выше возвращает исключение (32-битные процессы не могут получить доступ к модулям 64-битного процесса)?
Manish
0

Если у вас есть идентификатор процесса ( PID), вы можете убить этот процесс следующим образом:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();
tomloprod
источник
0

Вы можете убить определенный экземпляр 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();
}
Ракешрави Г
источник
-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

      foreach (Process process in Process.GetProcessesByName(processName))
      {
          process.Kill();
      }
}

//EndTask("notepad");

Резюме : независимо от того, содержит ли имя .exe, процесс завершится. Вам не нужно «убирать .exe из имени процесса», он работает на 100%.

user7993881
источник
1
простой .Replace(".exe", "")ответ, получивший голосование сверху, сделает это с гораздо менее запутанным и ненужным кодом
AndrewK
Вся идея заключается в том, чтобы увидеть метод с .exe или без него, чтобы люди могли увидеть несколько способов его обработки ... Он не предназначен для копирования и вставки ....
user7993881 09