Cómo obtener todos los procesos en una sesión de un proceso en particular que está utilizando un puerto en Windows cmd

Aug 17 2020

Quiero enumerar y matar todos los procesos que pertenecen a una sesión de un proceso en particular que está usando un puerto. Esto debería suceder a través de un comando por lotes de Windows que acepte un número de puerto como entrada.

Por ejemplo: digamos que un proceso PA está escuchando actualmente en el puerto 8081. PA se está ejecutando bajo la sesión S1 Hay procesos PB y PC que pertenecen a la misma sesión que PA. PB y PC se ejecutarán en puertos diferentes (no es importante en qué puertos se ejecutan)

El comando de Windows / archivo por lotes debe tomar 8081 como entrada y eliminar los procesos PA, PB y PC.

es posible? Agradezco un poco de ayuda en esto, ya que no estoy muy bien versado en comandos / secuencias de comandos por lotes.

Mi intento fallido:

(for /F "tokens=2" %%i in (for /f "tokens=5" %a in ('netstat -aon ^| findstr 8081') do tasklist /NH /FI "PID eq %a") do taskkill /NH /FI "SESSIONNAME eq %%i")

Respuestas

4 GeraldSchneider Aug 17 2020 at 20:28

En realidad, eso es bastante fácil en PowerShell:

# Get the process of the listening NetTCPConnection and the session ID of the process
$SessionId = (Get-Process -Id (Get-NetTCPConnection -State Listen -LocalPort 8081).OwningProcess).SessionId # Get all processes from that session and stop them Get-Process | Where-Object { $_.SessionId -eq $SessionId } | Stop-Process -Force -Confirm:$false
1 Vazid Aug 17 2020 at 21:14

Si está buscando un script por lotes

for /f "tokens=5" %%a in ('netstat -aon ^| findstr 8081 ^| findstr "LISTEN"') do (
    for /f "tokens=3" %%b in ('tasklist /NH /FI "PID eq %%a"') do (
        for /f "tokens=2" %%c in ('tasklist /NH /FI "SESSIONNAME eq %%b"') do (
            taskkill /F /PID %%c
        )
    )
)
WasifHasan Sep 22 2020 at 09:34

Puedes hacer una función de esto:

function kpn($port){ps|?{$_.sessionID-eq(get-NetTcpConnection -sta listen -loc $port)}|kill -fo -confirm:$false}

Y llámalo como

kpn(8081)