Como obter todos os processos em uma sessão de um processo específico que está usando uma porta no cmd do Windows
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
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
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
)
)
)
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)