Windows: Schnellste Methode zum Beenden eines Prozesses, der an einem bestimmten Port ausgeführt wird

11

Ich gehe diesen Prozess viele Male durch. Ich muss einen Prozess auf einem Windows-Computer beenden und kenne nur dessen Port. Normalerweise lauten die Schritte wie folgt: Ermitteln der PID anhand der Ports (Beispielport 8084) Listen Sie die Prozesse auf, die an den Ports ausgeführt werden

netstat -a -o -n

Beenden Sie dann den Prozess an diesem Port mit dem folgenden Befehl

taskkill /F /PID <pid>

Gibt es eine Pipe oder ähnliches, die ich unter Windows verwenden kann, um diesen Befehl in einer Zeile auszuführen?

Armand
quelle
1
Es tut mir leid, dass ich momentan keine vollständige Antwort schreiben kann, aber schauen Sie sich findstr(das Windows grep) an. Zum Beispiel : netstat -a -o -n | findstr "LISTENING" | findstr ":135". Vielleicht bringt dich das einen Schritt näher;)
Der Hochstapler
@OliverSalzburg Seien Sie vorsichtig mit dem 2 findstr.: Entspricht möglicherweise entweder der lokalen oder der Remote-Portnummer. (Akzeptiert, dass das Q nicht angibt, welche.)
Richard

Antworten:

10

Gibt es eine Pipe oder ähnliches, die ich unter Windows verwenden kann, um diesen Befehl in einer Zeile auszuführen?

Beide cmd.exeund PowerShell unterstützen Pipes von einem Befehl zum anderen. In PowerShell so etwas wie (dies sollte in einer einzelnen Zeile in der Befehlszeile stehen oder `verwenden, um Zeilenumbrüche in einem Skript zu umgehen):

netstat -ano
 | select -skip 4 
 | % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}} 
 | ? {$_.Fields[1] -match '15120$'}
 | % {taskkill /F /PID $_.Fields[4] }

Wo:

  • Select -skip 4Überspringt die ersten vier Kopfzeilen. ( Selectist die Abkürzung für Select-ObjectSQL SELECT-ähnliche Projekte von Objekten.
  • %ist Foreach-Objecteine Abkürzung, die einen Skriptblock für jedes Objekt ( $_) in der Pipeline ausführt und die Ergebnisse des Skriptblocks an die Pipeline ausgibt. Hier wird zuerst die Eingabe in ein Array von Feldern aufgeteilt und dann ein neues Objekt mit zwei Eigenschaften erstellt, aus denen Originaldie Zeichenfolge netstatund Fieldsdas gerade erstellte Array stammen.
  • ?ist eine Abkürzung für Where-Objectwelche Filter basierend auf dem Ergebnis eines Skriptblocks. Hier wird ein regulärer Ausdruck am Ende des zweiten Felds gefunden (alle PowerShell-Container basieren auf Null).

(Alle getestet außer dem letzten Element: Ich möchte nicht mit dem Töten von Prozessen beginnen :-)).

In der Praxis würde ich dies vereinfachen, z. Geben Sie nur 0 oder die PID von der ersten zurück foreach(die die Header ignorieren soll) und filtern Sie vor dem Aufruf nach einem Wert ungleich Null taskkill. Dies wäre schneller zu tippen, aber schwieriger zu befolgen, ohne PowerShell zu kennen.

Richard
quelle
Aus irgendeinem Grund erkennt meine Powershell die Auswahl nicht! Unter Windows 7 "Der Befehl" wählen Sie "ist falsch geschrieben oder kann nicht gefunden werden". Gleiches gilt für "Select-Object"
Armand
Dies hat bei mir funktioniert, aber der Prozess wird meiner Meinung nach zweimal gefunden, da IPv4- und IPv6-Versionen von aufgelistet werden netstat. Dies führt zu einem (wahrscheinlich harmlosen) Fehler von ERROR: The process "12345" not found..
Scott Weldon
Ich denke, das Wichtigste hier ist taskkill /F /PID [PID]. Damit kann jemand Aufgaben manuell beenden, solange er die PID ermitteln kann.
Sawtaytoes
1

Öffnen Sie die Eingabeaufforderung und führen Sie Folgendes aus:

for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a

Wenn Sie dies in einer .bat- Datei tun möchten, ersetzen Sie % a durch %% a .

Wenn Sie nur den töten möchten, der diesen Port abhört, fügen Sie (^ | find "LISTENING") am Ende des anderen Finds hinzu.

Josep Alsina
quelle