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?
findstr
(das Windowsgrep
) an. Zum Beispiel :netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Vielleicht bringt dich das einen Schritt näher;)findstr
.: Entspricht möglicherweise entweder der lokalen oder der Remote-Portnummer. (Akzeptiert, dass das Q nicht angibt, welche.)Antworten:
Beide
cmd.exe
und 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):Wo:
Select -skip 4
Überspringt die ersten vier Kopfzeilen. (Select
ist die Abkürzung fürSelect-Object
SQL SELECT-ähnliche Projekte von Objekten.%
istForeach-Object
eine 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 denenOriginal
die Zeichenfolgenetstat
undFields
das gerade erstellte Array stammen.?
ist eine Abkürzung fürWhere-Object
welche 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 Nulltaskkill
. Dies wäre schneller zu tippen, aber schwieriger zu befolgen, ohne PowerShell zu kennen.quelle
netstat
. Dies führt zu einem (wahrscheinlich harmlosen) Fehler vonERROR: The process "12345" not found.
.taskkill /F /PID [PID]
. Damit kann jemand Aufgaben manuell beenden, solange er die PID ermitteln kann.Öffnen Sie die Eingabeaufforderung und führen Sie Folgendes aus:
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.
quelle
Hier ist eine praktische Funktion, die Sie verwenden können:
https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1
quelle