Bazı işlemleri .exe dosya adına göre sonlandırın


Yanıtlar:


241

Hızlı cevap:

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

(işlem adından .exe'yi bırakın)


2
Yukarıdaki kod İstisna döndürürse ne yapılmalı (32 bitlik işlemler 64 bitlik bir işlemin modüllerine erişemez)?
Manish

40
".Exe" yi kapalı bırakın. MSDN'den: "İşlem adı, .exe uzantısını veya yolunu içermeyen Outlook gibi işlem için kolay bir addır"

1
@AgainMe Process.Kill () bir işleme öldürme sinyali gönderir ve bu da nerede olursa olsun yürütülmesini durdurur. Bu, işlemin sinyale yanıt verme ve / veya sinyalden temizleme şansı olmayacağı için bir kesme sinyalinden farklıdır. Bu süreçte başka yürütme olmayacak ve bu işlem tarafından kullanılan kaynaklar üzerindeki herhangi bir kilit kaldırılacaktır. Environment.Exit (), tamamen güvenli olan bir başarı koduyla kendini öldürmek için şu anda yürütülen işlem tarafından gerçekleştirilir. Process.Kill (), Environment.Exit () kadar güvenli değildir.
jchitel

2
LINQ kullanılmasını öneririm: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro

2
Bir sürecin belirli bir vakasını öldürmek için herhangi bir seçenek var mı? Demek istediğim, Contains("Spotify"))tüm örneklerini öldürür Spotify. Belirli bir örneğini öldürmek istiyorum Spotify.
Banee Ishaque K

38

Çözümüm, tüm işlemleri listelemek için Process.GetProcess () kullanmaktır .
İstediğim işlemleri içerecek şekilde filtreleyerek, onları durdurmak için Process.Kill () yöntemini çalıştırabilirim :

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

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

Güncelleme:

asyncYaklaşımı C# 8( Async Enumerables ) ' dan bazı yararlı yeni yöntemlerle kullanmak istiyorsanız , şunu kontrol edin:

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

Not: asyncyöntemlerin kullanılması her zaman kodun daha hızlı çalışacağı anlamına gelmez, ancak en azından CPU zamanını boşa harcamayacak ve işlemleri yaparken ön plan iş parçacığının takılmasını önleyecektir. Her durumda, hangi sürümü isteyebileceğinizi düşünmeniz gerekir.


Eşit olmak yerine İçerir kullanabilirsiniz
Leandro

10
Komik bir tesadüf, krom sürücüyü öldürmek için bu ipliğe bir çözüm arıyordum. Ortak bir sorun olmalı.
kerl

Burada aynı. bu sorunu çözmüyor gibi görünüyor. Ateşlenen ilk konsol aslında bir chrome.exe örneğidir ve sanırım bir derleme / test aracısı olmadıkça hepsini kapatmaya zorlamak istemezsiniz
Dan Csharpster

16

Şu Process.GetProcesses()anda çalışan işlemleri almak ve ardından Process.Kill()bir işlemi sonlandırmak için kullanabilirsiniz.


6
Process.GetProcessesByName bunu basitleştirecektir.
ConsultUtah

Yukarıdaki kod İstisna döndürürse ne yapılmalı (32 bitlik işlemler 64 bitlik bir işlemin modüllerine erişemez)?
Manish

0

İşlem kimliğine ( PID) sahipseniz, bu işlemi şu şekilde sonlandırabilirsiniz:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();

0

MS Word'ün belirli bir örneğini öldürebilirsiniz.

foreach (var process in Process.GetProcessesByName("WINWORD"))
{
    // Temp is a document which you need to kill.
    if (process.MainWindowTitle.Contains("Temp")) 
        process.Kill();
}

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

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

//EndTask("notepad");

Özet : adın .exe içermesi önemli değil, işlem sona erecektir. ".Exe'yi işlem adından ayırmanıza" gerek yoktur,% 100 çalışır.


1
.Replace(".exe", "")en çok oylanan cevapta basit bir cevap, bunu çok daha az karmaşık ve gereksiz kodla
yapardı

Tüm fikir, yöntemi .exe ile veya .exe olmadan görmektir, böylece insanlar onu ele almanın birden fazla yolunu görebilir ... Kopyala ve yapıştırmak için tasarlanmamıştır ....
user7993881
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.