Je vais sur ce processus plusieurs fois. Je dois tuer un processus sur une machine Windows et je connais juste son port. En règle générale, procédez comme suit: Recherchez le PID en consultant les ports (exemple, le port 8084). Répertoriez 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 at-il quelque chose comme un tuyau ou similaire que je peux utiliser sous Windows pour exécuter cette commande en une seule ligne!?
Existe-t-il quelque chose comme un tuyau ou similaire que je peux utiliser sous Windows pour exécuter cette commande sur une ligne?
cmd.exe
et PowerShell prennent en charge les canaux d'une commande à l'autre. Dans PowerShell, quelque chose comme (cela devrait être sur une seule ligne de la ligne de commande, ou utilisez `pour échapper à des nouvelles lignes 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 4
ignore les quatre premières lignes d'en-tête. (Select
est l'abréviation de Select-Object
utilisé pour exécuter SQL SELECT comme des projets d'objets.%
est l'abréviation de Foreach-Object
qui exécute un bloc de script sur chaque objet ($_
) du pipeline et renvoie les résultats du bloc de script dans le pipeline. Ici, il commence par diviser les entrées en un tableau de champs, puis en créant un nouvel objet avec deux propriétés: Original
name__, la chaîne de netstat
et Fields
name__, le tableau qui vient d'être créé.?
est l'abréviation de Where-Object
qui filtre en fonction du résultat d'un bloc de script. Correspondant ici à une expression rationnelle à 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 ceci, par exemple. ne renvoie que 0 ou le PID du premier foreach
(qui serait conçu pour ignorer les en-têtes) et filtre sur la valeur non nulle avant d'appeler taskkill
name__. Cela serait plus rapide à taper mais plus difficile à suivre sans connaître PowerShell.
Voici une fonction pratique que vous pouvez utiliser:
https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1
killp 8081
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 fichier .bat, remplacez % a par %% a.
Si vous voulez juste tuer celui qui écoute sur ce port, ajoutez (^ | find "LISTENING") à la fin de l'autre find.