¿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.exe
y 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 4
omite las primeras cuatro líneas de encabezado. ( Select
es la abreviatura de Select-Object
utilizado para realizar SQL SELECT como proyectos de objetos.
%
es la abreviatura de Foreach-Object
que 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 Original
la cadena netstat
y Fields
la matriz que acaba de crear.
?
es la abreviatura de los Where-Object
filtros 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.
findstr
(Windowsgrep
). Por ejemplo:netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Tal vez esto te acerque un paso más;)