Beenden Sie einige Prozesse mit dem Dateinamen .exe

Antworten:

241

Schnelle Antwort:

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

(Lassen Sie .exe vom Prozessnamen weg)

ConsultUtah
quelle
2
Was ist zu tun, wenn der obige Code eine Ausnahme zurückgibt (32-Bit-Prozesse können nicht auf Module eines 64-Bit-Prozesses zugreifen)?
Manish
40
Lassen Sie ".exe" weg. Von MSDN: "Der Prozessname ist ein
1
@AgainMe Process.Kill () sendet ein Kill-Signal an einen Prozess, der seine Ausführung an jedem Ort anhält. Dies unterscheidet sich von einem Interrupt-Signal darin, dass der Prozess keine Chance hat, auf das Signal zu reagieren und / oder es zu bereinigen. In diesem Prozess wird keine Ausführung mehr ausgeführt, und alle Sperren für die von diesem Prozess verwendeten Ressourcen werden aufgehoben. Environment.Exit () wird vom aktuell ausgeführten Prozess ausgeführt, um sich selbst mit einem Erfolgscode zu töten, der absolut sicher ist. Process.Kill () ist bei weitem nicht so sicher wie Environment.Exit ().
Jchitel
2
Ich schlage die Verwendung von LINQ vor: var procs = Process.GetProcesses (). Where (pr => pr.ProcessName.Contains ("Spotify"));
Leandro
2
Gibt es eine Option, um eine bestimmte Instanz eines Prozesses zu beenden? Ich meine, Contains("Spotify"))tötet alle Instanzen von Spotify. Ich möchte eine bestimmte Instanz von töten Spotify.
Banee Ishaque K
38

Meine Lösung besteht darin, Process.GetProcess () zum Auflisten aller Prozesse zu verwenden.
Indem ich sie filtere, um die gewünschten Prozesse zu enthalten, kann ich die Process.Kill () -Methode ausführen , um sie zu stoppen:

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

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

Aktualisieren:

Wenn Sie den asyncAnsatz mit einigen nützlichen neueren Methoden aus C# 8( Async Enumerables ) verwenden möchten , überprüfen Sie Folgendes :

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

Hinweis: Die Verwendung von asyncMethoden bedeutet nicht immer, dass Code schneller ausgeführt wird, verschwendet jedoch nicht die CPU-Zeit und verhindert, dass der Vordergrund-Thread während der Ausführung hängt. In jedem Fall müssen Sie überlegen, welche Version Sie möchten.

Arsen Khachaturyan
quelle
Sie könnten Contains anstelle von gleich verwenden
Leandro
10
Ein lustiger Zufall ist, dass ich in diesem Thread nach einer Lösung gesucht habe, um den Chromedriver zu töten. Muss ein häufiges Problem sein.
Kerl
Hier gilt das gleiche. das scheint es aber nicht zu lösen. Die anfängliche Konsole, die ausgelöst wird, ist tatsächlich eine Instanz von chrome.exe, und ich vermute, Sie möchten nicht alle schließen, es sei denn, es handelt sich um einen Build- / Test-Agenten
Dan Csharpster,
16

Sie können verwenden Process.GetProcesses(), um die aktuell ausgeführten Prozesse abzurufen und dann Process.Kill()einen Prozess abzubrechen.

driis
quelle
6
Process.GetProcessesByName würde dies vereinfachen.
ConsultUtah
Was ist zu tun, wenn der obige Code eine Ausnahme zurückgibt (32-Bit-Prozesse können nicht auf Module eines 64-Bit-Prozesses zugreifen)?
Manish
0

Wenn Sie die Prozess-ID ( PID) haben, können Sie diesen Prozess wie folgt beenden:

Process processToKill = Process.GetProcessById(pid);
processToKill.Kill();
Tomloprod
quelle
0

Sie können eine bestimmte Instanz von MS Word beenden.

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.
quelle
-2
public void EndTask(string taskname)
{
      string processName = taskname.Replace(".exe", "");

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

//EndTask("notepad");

Zusammenfassung : Unabhängig davon, ob der Name .exe enthält, wird der Vorgang beendet. Sie müssen ".exe nicht vom Prozessnamen weglassen", es funktioniert zu 100%.

user7993881
quelle
1
Eine einfache .Replace(".exe", "")Antwort auf die oberste Stimme würde dies mit viel weniger
verschlungenem
Die ganze Idee davon ist, die Methode mit oder ohne .exe zu sehen, damit die Leute mehrere Möglichkeiten sehen können, damit
umzugehen