Como obter todos os processos em uma sessão de um processo específico que está usando uma porta no cmd do Windows

Aug 17 2020

Quero listar e eliminar todos os processos pertencentes a uma sessão de um processo específico que está usando uma porta. Isso deve acontecer por meio de um comando de lote do Windows que aceitaria um número de porta como entrada.

Por exemplo: Digamos que um processo PA está escutando atualmente na porta 8081. PA está sendo executado na sessão S1. Existem processos PB e PC pertencentes à mesma sessão do PA. PB e PC funcionarão em portas diferentes (não é importante em quais portas estão rodando)

O arquivo de comando / lote do Windows deve ter 8081 como entrada e eliminar os processos PA, PB e PC.

Isso é possível? Agradeço uma ajudinha nisso, pois não sou muito versado em comandos / scripts em lote.

Minha tentativa falhada:

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

Respostas

4 GeraldSchneider Aug 17 2020 at 20:28

Na verdade, isso é muito fácil no 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

Se você está procurando um script em lote

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

Você pode fazer uma função a partir deste:

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

E chamá-lo como

kpn(8081)