Bunuh beberapa proses dengan nama file .exe

Jawaban:

241

Jawaban cepat:

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

(tinggalkan .exe dari nama proses)

ConsultUtah
sumber
2
apa yang harus dilakukan jika kode di atas mengembalikan Exception (proses 32 bit tidak dapat mengakses modul dari proses 64 bit)?
Manish
40
Tinggalkan ".exe". Dari MSDN: "Nama proses adalah nama yang bersahabat untuk proses, seperti Outlook, yang tidak menyertakan ekstensi .exe atau jalur"
1
@AgainMe Process.Kill () mengirimkan sinyal kill ke proses, yang akan menghentikan eksekusinya di mana pun itu terjadi. Ini berbeda dari sinyal interupsi di mana proses tidak akan memiliki kesempatan untuk merespons dan / atau membersihkan sinyal. Tidak ada lagi eksekusi yang akan terjadi dalam proses itu, dan semua kunci pada sumber daya yang digunakan oleh proses itu akan dilepaskan. Environment.Exit () dilakukan oleh proses yang saat ini dijalankan untuk mematikan dirinya sendiri dengan kode sukses, yang sangat aman. Process.Kill () hampir tidak seaman Environment.Exit ().
jchitel
2
Saya menyarankan penggunaan LINQ: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
Adakah pilihan untuk menghentikan proses tertentu? Maksud saya, Contains("Spotify"))membunuh semua contoh Spotify. Saya ingin membunuh contoh tertentu dari Spotify.
Banee Ishaque K
38

Solusi saya adalah menggunakan Process.GetProcess () untuk mendaftar semua proses.
Dengan memfilternya agar berisi proses yang saya inginkan, saya kemudian dapat menjalankan metode Process.Kill () untuk menghentikannya:

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

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

Memperbarui:

Jika ingin menggunakan asyncpendekatan dengan beberapa metode terbaru yang berguna dari C# 8( Async Enumerables ), periksa ini:

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

Catatan: menggunakan asyncmetode tidak selalu berarti kode akan berjalan lebih cepat, tetapi setidaknya itu tidak akan membuang waktu CPU dan akan mencegah thread latar depan menggantung saat melakukan operasi. Bagaimanapun, Anda perlu memikirkan versi apa yang mungkin Anda inginkan.

Arsen Khachaturyan
sumber
Anda bisa menggunakan Berisi bukannya sama
Leandro
10
Kebetulan yang lucu adalah, saya sedang mencari solusi di thread ini untuk membunuh chromedriver. Pasti masalah umum.
kerl
Sama disini. itu sepertinya tidak menyelesaikannya. Konsol awal yang dimatikan sebenarnya adalah turunan dari chrome.exe dan saya rasa Anda tidak ingin menutup paksa semua itu kecuali itu adalah agen pembuat / uji
Dan Csharpster
16

Anda dapat menggunakan Process.GetProcesses()untuk mendapatkan proses yang sedang berjalan, kemudian Process.Kill()menghentikan proses.

driis
sumber
6
Process.GetProcessesByName akan menyederhanakan ini.
ConsultUtah
apa yang harus dilakukan jika kode di atas mengembalikan Exception (proses 32 bit tidak dapat mengakses modul dari proses 64 bit)?
Manish
0

Jika Anda memiliki ID proses ( PID), Anda dapat menghentikan proses ini sebagai berikut:

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

Anda dapat Membunuh contoh tertentu dari 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
sumber
-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

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

//EndTask("notepad");

Ringkasan : tidak peduli jika namanya mengandung .exe, prosesnya akan berakhir. Anda tidak perlu "meninggalkan .exe dari nama proses", Ini berfungsi 100%.

pengguna7993881
sumber
1
.Replace(".exe", "")jawaban sederhana di atas yang dipilih akan melakukan ini dengan kode yang jauh lebih berbelit-belit dan tidak perlu
AndrewK
Ide keseluruhannya adalah untuk melihat metode dengan atau tanpa .exe sehingga orang dapat melihat berbagai cara untuk menanganinya ... Ini tidak dimaksudkan untuk menyalin dan menempel ....
user7993881