Windows: le moyen le plus rapide de tuer un processus exécuté sur un port spécifique

11

Je revois ce processus plusieurs fois. Je dois tuer un processus sur une machine Windows et je connais juste son port. Normalement, les étapes sont les suivantes: Trouvez le PID en regardant les ports (exemple le port 8084) Liste les processus en cours d'exécution sur les ports

netstat -a -o -n

Et puis tuez le processus sur ce port avec la commande suivante

taskkill /F /PID <pid>

Y a-t-il quelque chose comme un tuyau ou similaire que je peux utiliser sur Windows OS pour exécuter cette commande sur une seule ligne!?

Armand
la source
1
Je suis désolé de ne pas pouvoir écrire de réponse complète pour le moment, mais jetez un œil à findstr(Windows grep). Par exemple: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Peut-être que cela vous rapproche un peu;)
Der Hochstapler
@OliverSalzburg Besoin d'être prudent avec ce 2ème findstr: peut correspondre au numéro de port local ou distant. (Accepter que le Q ne spécifie pas lequel.)
Richard

Réponses:

10

Y a-t-il quelque chose comme un tuyau ou similaire que je peux utiliser sur le système d'exploitation Windows pour exécuter cette commande sur une seule ligne?

Les deux cmd.exeet PowerShell prennent en charge les canaux d'une commande à l'autre. Dans PowerShell quelque chose comme (cela devrait être sur une seule ligne sur la ligne de commande, ou utiliser `pour échapper les sauts de ligne dans un script):

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

Où:

  • Select -skip 4saute les quatre premières lignes d'en-tête. ( Selectest Select-Objectutilisé pour exécuter SQL SELECT comme des projets d'objets.
  • %est l'abréviation pour Foreach-Objectlaquelle effectue un bloc de script sur chaque objet ( $_) du pipeline et renvoie les résultats du bloc de script au pipeline. Ici, il décompose d'abord l'entrée en un tableau de champs, puis crée un nouvel objet avec deux propriétés à partir de Originalla chaîne netstatet Fieldsdu tableau que vous venez de créer.
  • ?est un raccourci pour Where-Objectlequel les filtres sont basés sur le résultat d'un bloc de script. Correspondant ici à une expression régulière à la fin du deuxième champ (tous les conteneurs PowerShell sont basés sur zéro).

(Tous testés sauf le dernier élément: je ne veux pas commencer à tuer les processus :-)).

En pratique, je simplifierais cela, par exemple. renvoyant juste 0 ou le PID du premier foreach(qui serait conçu pour ignorer les en-têtes) et filtrer sur une valeur non nulle avant d'appeler taskkill. Ce serait plus rapide à taper mais plus difficile à suivre sans connaître PowerShell.

Richard
la source
pour une raison quelconque, mon PowerShell ne reconnaît pas le Select! Sous Windows 7 "Der Befehl", sélectionnez "ist entweder falsch geschrieben oder konnte nicht gefunden werden". Pareil pour "Select-Object"
Armand
Cela a fonctionné pour moi, mais le processus se trouve deux fois, je crois en raison des versions IPv4 et IPv6 répertoriées par netstat. Cela conduit à une erreur (probablement inoffensive) de ERROR: The process "12345" not found..
Scott Weldon
Je pense que le point important à retenir ici est taskkill /F /PID [PID]. Avec cela, quelqu'un peut tuer manuellement des tâches tant qu'il a un moyen d'obtenir le PID.
Sawtaytoes
1

Ouvrez l'invite de commande et exécutez:

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

Si vous voulez le faire dans un .bat, remplacez % a pour %% a .

Si vous voulez juste tuer celui qui écoute sur ce port, ajoutez (^ | find "LISTENING") à la fin de l'autre recherche.

Josep Alsina
la source