Mate alguns processos pelo nome de arquivo .exe

Respostas:

241

Resposta rápida:

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

(deixe de fora .exe do nome do processo)

ConsultUtah
fonte
2
o que deve ser feito se o código acima retornar Exceção (um processo de 32 bits não pode acessar os módulos de um processo de 64 bits)?
Manish
40
Pare com ".exe". De MSDN: "O nome do processo é um nome amigável para o processo, como o Outlook, que não inclui a extensão .exe ou o caminho"
1
O @AgainMe Process.Kill () envia um sinal de interrupção para um processo, que interromperá sua execução onde quer que esteja. Isso é diferente de um sinal de interrupção, pois o processo não terá chance de responder e / ou limpar o sinal. Não haverá mais execução nesse processo, e quaisquer bloqueios nos recursos usados ​​por esse processo serão liberados. Environment.Exit () é executado pelo processo atualmente em execução para se matar com um código de sucesso, o que é perfeitamente seguro. Process.Kill () não é tão seguro quanto Environment.Exit ().
jchitel
2
Sugiro o uso de LINQ: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
Alguma opção para matar uma instância específica de um processo? Quero dizer, Contains("Spotify"))mata todas as instâncias de Spotify. Eu quero matar uma instância específica de Spotify.
Banee Ishaque K
38

Minha solução é usar Process.GetProcess () para listar todos os processos.
Ao filtrá-los para conter os processos desejados, posso executar o método Process.Kill () para interrompê-los:

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

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

Atualizar:

Caso queira usar a asyncabordagem com alguns métodos recentes úteis do C# 8( Async Enumerables ), verifique isso:

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

Nota: o uso de asyncmétodos nem sempre significa que o código será executado mais rapidamente, mas pelo menos não desperdiçará o tempo da CPU e impedirá que o encadeamento em primeiro plano seja interrompido durante as operações. De qualquer forma, você precisa pensar sobre a versão que deseja.

Arsen Khachaturyan
fonte
você poderia usar Contém vez de igual
Leandro
10
Engraçado coincidência é que eu estava procurando neste tópico uma solução para matar o cromedriver. Deve ser um problema comum.
kerl
O mesmo aqui. isso não parece resolver o problema. O console inicial que é demitido off é na verdade uma instância de chrome.exe e eu estou supondo que você não quer forçar perto todos aqueles a menos que seu um agente de compilação / test
Dan Csharpster
16

Você pode usar Process.GetProcesses()para obter os processos atualmente em execução e depois Process.Kill()matar um processo.

driis
fonte
6
Process.GetProcessesByName simplificaria isso.
ConsultUtah
o que deve ser feito se o código acima retornar Exceção (um processo de 32 bits não pode acessar os módulos de um processo de 64 bits)?
Manish
0

Se você possui o ID do processo ( PID), pode matar esse processo da seguinte maneira:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();
tomloprode
fonte
0

Você pode matar uma instância específica do 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
fonte
-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

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

//EndTask("notepad");

Resumo : não importa se o nome contém .exe, o processo será encerrado. Você não precisa "excluir .exe do nome do processo", ele funciona 100%.

user7993881
fonte
1
uma simples .Replace(".exe", "")no topo votou resposta seria fazer isso com o código muito menos complicado e desnecessário
AndrewK
Toda a idéia de que é ver o método com ou sem .exe que as pessoas possam ver várias maneiras de lidar com isso ... Não é significou para copiar e colar ....
user7993881