Zabij niektóre procesy według nazwy pliku .exe

Odpowiedzi:

241

Szybka odpowiedź:

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

(zostaw .exe z nazwy procesu)

ConsultUtah
źródło
2
co należy zrobić, jeśli powyższy kod zwróci wyjątek (procesy 32-bitowe nie mogą uzyskać dostępu do modułów procesu 64-bitowego)?
Manish
40
Pozostaw „.exe”. Z MSDN: „Nazwa procesu to przyjazna nazwa procesu, taka jak Outlook, która nie zawiera rozszerzenia .exe ani ścieżki”
1
@AgainMe Process.Kill () wysyła sygnał zabicia do procesu, który zatrzyma jego wykonanie, gdziekolwiek to nastąpi. Różni się to od sygnału przerwania tym, że proces nie będzie miał szansy odpowiedzieć i / lub oczyścić się z sygnału. W tym procesie nie będzie więcej wykonywania, a wszelkie blokady zasobów używanych przez ten proces zostaną zwolnione. Environment.Exit () jest wykonywana przez aktualnie wykonywany proces, aby zabić się kodem sukcesu, co jest całkowicie bezpieczne. Process.Kill () nie jest tak bezpieczny jak Environment.Exit ().
jchitel
2
Proponuję użycie LINQ: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
Czy jest jakaś opcja zabicia określonej instancji procesu? To znaczy, Contains("Spotify"))zabija wszystkie instancje Spotify. Chcę zabić konkretną instancję Spotify.
Banee Ishaque K
38

Moim rozwiązaniem jest użycie Process.GetProcess () do wyświetlenia wszystkich procesów. Filtrując
je tak, aby zawierały procesy, które chcę, mogę następnie uruchomić metodę Process.Kill () , aby je zatrzymać:

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

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

Aktualizacja:

W przypadku, gdy chcesz użyć asyncpodejścia z kilkoma przydatnymi najnowszymi metodami z C# 8( Async Enumerables ), sprawdź to:

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

Uwaga: używanie asyncmetod nie zawsze oznacza, że ​​kod będzie działał szybciej, ale przynajmniej nie zmarnuje czasu procesora i zapobiegnie zawieszaniu się wątku pierwszego planu podczas wykonywania operacji. W każdym razie musisz się zastanowić, jakiej wersji możesz potrzebować.

Arsen Khachaturyan
źródło
możesz użyć Zawartości zamiast równych
Leandro
10
Zabawny zbieg okoliczności, że szukałem w tym wątku rozwiązania problemu zabicia chromowanego pilota. To musi być powszechny problem.
kerl
To samo tutaj. to jednak nie wydaje się rozwiązać tego problemu. Początkowa konsola, która zostaje zwolniona, jest w rzeczywistości instancją chrome.exe i domyślam się, że nie chcesz wymuszać ich zamknięcia, chyba że jest to agent kompilacji / testowania
Dan Csharpster
16

Możesz użyć, Process.GetProcesses()aby pobrać aktualnie uruchomione procesy, a następnie Process.Kill()zabić proces.

driis
źródło
6
Process.GetProcessesByName uprościłoby to.
ConsultUtah,
co należy zrobić, jeśli powyższy kod zwróci wyjątek (procesy 32-bitowe nie mogą uzyskać dostępu do modułów procesu 64-bitowego)?
Manish
0

Jeśli masz identyfikator procesu ( PID), możesz zabić ten proces w następujący sposób:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();
tomloprod
źródło
0

Możesz zabić określoną instancję 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
źródło
-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

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

//EndTask("notepad");

Podsumowanie : bez względu na to, czy nazwa zawiera .exe, proces się zakończy. Nie musisz "zostawiać .exe z nazwy procesu", to działa w 100%.

user7993881
źródło
1
prosta .Replace(".exe", "")odpowiedź głosowana na górze wystarczyłaby do tego z dużo mniej zawiłym i niepotrzebnym kodem
AndrewK
Chodzi o to, aby zobaczyć metodę z rozszerzeniem .exe lub bez, aby ludzie mogli zobaczyć wiele sposobów jej obsługi ... Nie jest przeznaczony do kopiowania i wklejania ....
user7993881