Cómo obtener todos los procesos en una sesión de un proceso particular que utiliza un puerto en el cmd de Windows

Cómo obtener todos los procesos en una sesión de un proceso particular que utiliza un puerto en el cmd de Windows

Quiero enumerar y eliminar todos los procesos que pertenecen a una sesión de un proceso en particular que utiliza un puerto. Esto debería suceder a través de un comando por lotes de Windows que aceptaría 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 en 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 archivo de comando/por lotes de Windows debe tomar 8081 como entrada y finalizar los procesos PA, PB y PC.

es posible? Agradezco un poco de ayuda con esto, ya que no estoy muy versado en comandos/scripting 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")

Respuesta1

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

Respuesta2

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
        )
    )
)

Respuesta3

Puedes hacer una función a partir de esto:

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

Y llámalo como

kpn(8081)

información relacionada