Eliminar algunos procesos por nombre de archivo .exe

Respuestas:

241

Respuesta rápida:

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

(deje el .exe del nombre del proceso)

ConsultarUtah
fuente
2
¿Qué debe hacerse si el código anterior devuelve la excepción (un proceso de 32 bits no puede acceder a los módulos de un proceso de 64 bits)?
Manish
40
Deje ".exe". De MSDN: "El nombre del proceso es un nombre
1
@AgainMe Process.Kill () envía una señal de cierre a un proceso, que detendrá su ejecución donde sea que se encuentre. Esto es diferente de una señal de interrupción en que el proceso no tendrá la oportunidad de responder y / o limpiar de la señal. No se realizará más ejecución en ese proceso, y se liberará cualquier bloqueo en los recursos utilizados por ese proceso. Environment.Exit () se realiza mediante el proceso que se está ejecutando actualmente para suicidarse con un código de éxito, que es perfectamente seguro. Process.Kill () no es tan seguro como Environment.Exit ().
jchitel
2
Sugiero el uso de LINQ: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
¿Alguna opción para matar una instancia específica de un proceso? Quiero decir, Contains("Spotify"))mata todas las instancias de Spotify. Quiero matar una instancia particular de Spotify.
Banee Ishaque K
38

Mi solución es usar Process.GetProcess () para enumerar todos los procesos.
Al filtrarlos para contener los procesos que quiero, puedo ejecutar el método Process.Kill () para detenerlos:

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

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

Actualizar:

En caso de que si desea utilizar el asyncenfoque con algunos métodos recientes útiles de C# 8( Async Enumerables ), verifique esto:

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

Nota: el uso de asyncmétodos no siempre significa que el código se ejecutará más rápido, pero al menos no perderá el tiempo de la CPU y evitará que el subproceso en primer plano se cuelgue mientras realiza las operaciones. En cualquier caso, debe pensar qué versión puede querer.

Arsen Khachaturyan
fuente
podrías usar Contiene en lugar de igual
Leandro
10
Curiosa coincidencia es que estaba buscando en este hilo una solución para matar el controlador cromado. Debe ser un problema común.
kerl
Igual que aquí. aunque eso no parece resolverlo. La consola inicial que se dispara es en realidad una instancia de chrome.exe y supongo que no desea forzar el cierre de todos ellos a menos que sea un agente de compilación / prueba
Dan Csharpster
16

Puede usar Process.GetProcesses()para obtener los procesos que se están ejecutando actualmente y luego Process.Kill()matar un proceso.

driis
fuente
66
Process.GetProcessesByName simplificaría esto.
ConsultarUtah
¿Qué debe hacerse si el código anterior devuelve la excepción (un proceso de 32 bits no puede acceder a los módulos de un proceso de 64 bits)?
Manish
0

Si tiene el ID de proceso ( PID), puede eliminar este proceso de la siguiente manera:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();
tomloprod
fuente
0

Puede matar una instancia específica de 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();
}
Rakeshravi G
fuente
-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

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

//EndTask("notepad");

Resumen : no importa si el nombre contiene .exe, el proceso finalizará. No necesita "dejar .exe del nombre del proceso", funciona al 100%.

usuario7993881
fuente
1
una .Replace(".exe", "")respuesta simple en la parte superior votada haría esto con un código mucho menos complicado e innecesario
AndrewK
La idea es ver el método con o sin .exe para que las personas puedan ver múltiples formas de manejarlo ... No está diseñado para copiar y pegar ...
user7993881