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

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


person Aliasghar Yaghoobzadeh    schedule 27.07.2010    source источник
comment
Если вам нужно убить процесс по частичному имени, см. stackoverflow.com/questions/14632162/.   -  person Alexei Levenkov    schedule 18.09.2014


Ответы (6)


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

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

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

person ConsultUtah    schedule 27.07.2010
comment
что делать, если приведенный выше код возвращает исключение (32-битные процессы не могут получить доступ к модулям 64-битного процесса)? - person Manish; 31.08.2013
comment
Оставьте .exe. Из MSDN: имя процесса — это понятное имя для процесса, такого как Outlook, которое не включает расширение .exe или путь - person ; 03.06.2014
comment
Kill в безопасности, как Environment.Exit(0)? - person AgainMe; 28.09.2016
comment
@AgainMe Process.Kill() отправляет процессу сигнал уничтожения, который останавливает его выполнение, где бы он ни находился. Это отличается от сигнала прерывания тем, что у процесса не будет возможности ответить и/или очиститься от сигнала. В этом процессе больше не будет выполняться выполнение, и все блокировки ресурсов, используемых этим процессом, будут сняты. Environment.Exit() выполняется текущим процессом, чтобы убить себя с кодом успеха, что совершенно безопасно. Process.Kill() далеко не так безопасен, как Environment.Exit(). - person jchitel; 21.02.2017
comment
Я предлагаю использовать LINQ: var procs = Process.GetProcesses().Where(pr => pr.ProcessName.Contains(Spotify)); - person Leandro Bardelli; 18.07.2017
comment
Есть ли вариант убить конкретный экземпляр процесса? Я имею в виду, что Contains("Spotify")) убивает все экземпляры Spotify. Я хочу убить конкретный экземпляр Spotify. - person Banee Ishaque K; 13.02.2018
comment
@BaneeIshaqueK У меня было похожее требование, я использовал MainWindowTitle, чтобы найти правильный процесс, и использовал CloseMainWindow, чтобы закрыть его. Можешь попробовать - person Antoops; 09.12.2019

Мое решение состоит в том, чтобы использовать 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 не всегда означает, что код будет работать быстрее.
Основное преимущество этого метода заключается в том, что поток переднего плана будет освобожден во время выполнения операции.

person Arsen Khachaturyan    schedule 27.12.2013
comment
вы можете использовать «Содержит» вместо «равно» - person Leandro Bardelli; 18.07.2017
comment
Забавное совпадение, я искал в этой теме решение для убийства хромированного драйвера. Должна быть общая проблема. - person kerl; 09.08.2017
comment
То же самое. это, похоже, не решает эту проблему. Начальная консоль, которая запускается, на самом деле является экземпляром chrome.exe, и я предполагаю, что вы не хотите принудительно закрывать все из них, если это не агент сборки/тестирования. - person Dan Csharpster; 22.05.2019

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

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

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

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();
person tomloprod    schedule 22.04.2019

Вы можете убить конкретный экземпляр 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();
}
person Community    schedule 07.11.2019

public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

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

//EndTask("notepad");

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

person user7993881    schedule 09.06.2017
comment
простой .Replace(".exe", "") в ответе с наибольшим количеством голосов сделал бы это с гораздо менее запутанным и ненужным кодом - person AndrewK; 13.01.2018
comment
Вся идея состоит в том, чтобы увидеть метод с .exe или без него, чтобы люди могли увидеть несколько способов его обработки... Он не предназначен для копирования и вставки.... - person user7993881; 09.03.2018
comment
это не сработает, если имя на самом деле содержит .exe, например. my.exeption.exe В качестве альтернативы вы можете проверить подстроку из последних четырех символов. Хотя, опять же, для имени с my.exe.exe это не удастся. Просто указываю на это. - person Sidupac; 15.04.2021