Windows: la forma más rápida de eliminar un proceso que se ejecuta en un puerto específico

11

Estoy repasando este proceso muchas veces. Tengo que matar un proceso en una máquina con Windows y solo conozco su puerto. Normalmente, los pasos son los siguientes: Encuentre el PID mirando los puertos (ejemplo, puerto 8084) Enumere los procesos que se ejecutan en los puertos

netstat -a -o -n

Y luego elimine el proceso en ese puerto con el siguiente comando

taskkill /F /PID <pid>

¿Hay algo como una tubería o similar que pueda usar en el sistema operativo Windows para ejecutar este comando en una línea?

Armand
fuente
1
Lamento no poder escribir una respuesta completa en este momento, pero eche un vistazo a findstr(Windows grep). Por ejemplo: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Tal vez esto te acerque un paso más;)
Der Hochstapler
@OliverSalzburg Debe tener cuidado con ese segundo findstr: podría coincidir con el número de puerto local o remoto. (Aceptando que la Q no especifica cuál.)
Richard

Respuestas:

10

¿Hay algo como una tubería o similar que pueda usar en el sistema operativo Windows para ejecutar este comando en una línea?

Ambos cmd.exey PowerShell admiten canalizaciones de un comando a otro. En PowerShell algo así (esto debería estar en una sola línea en la línea de comando, o usar `para escapar de las nuevas líneas en 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] }

Dónde:

  • Select -skip 4omite las primeras cuatro líneas de encabezado. ( Selectes la abreviatura de Select-Objectutilizado para realizar SQL SELECT como proyectos de objetos.
  • %es la abreviatura de Foreach-Objectque realiza un bloque de script en cada objeto ( $_) en la tubería y genera los resultados del bloque de script en la tubería. Aquí se divide primero la entrada en una matriz de campos y luego se crea un objeto nuevo con dos propiedades de Originalla cadena netstaty Fieldsla matriz que acaba de crear.
  • ?es la abreviatura de los Where-Objectfiltros basados ​​en el resultado de un bloque de script. Aquí coincide con una expresión regular al final del segundo campo (todos los contenedores de PowerShell están basados ​​en cero).

(Todos probados excepto el último elemento: no quiero comenzar a matar procesos :-)).

En la práctica, simplificaría esto, por ejemplo. devolviendo solo 0 o el PID desde el primero foreach(que estaría diseñado para ignorar los encabezados) y filtrar el valor no cero antes de llamar taskkill. Esto sería más rápido de escribir pero más difícil de seguir sin conocer PowerShell.

Ricardo
fuente
¡Por alguna razón, mi PowerShell no reconoce la selección! Ejecutando Windows 7 "Der Befehl" seleccione "ist entweder falsch geschrieben oder konnte nicht gefunden werden". Lo mismo para "Seleccionar objeto"
Armand
Esto funcionó para mí, pero creo que el proceso se encuentra dos veces, debido a que las versiones de IPv4 e IPv6 aparecen en la lista netstat. Esto lleva a un error (probablemente inofensivo) de ERROR: The process "12345" not found..
Scott Weldon el
Creo que la comida para llevar importante aquí es taskkill /F /PID [PID]. Con eso, alguien puede matar tareas manualmente siempre que tenga una forma de obtener el PID.
Sawtaytoes
1

Abra el símbolo del sistema y ejecute:

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

Si desea hacerlo en un .bat, reemplace % a por %% a .

Si solo quiere matar al que está escuchando en ese puerto, añada (^ | find "LISTENING") al final del otro find.

Josep Alsina
fuente