Come ottenere tutti i processi in una sessione di un particolare processo che utilizza una porta in Windows cmd
Voglio elencare e terminare tutti i processi appartenenti a una sessione di un particolare processo che utilizza una porta. Ciò dovrebbe avvenire tramite un comando batch di Windows che accetti un numero di porta come input.
Ad esempio: supponiamo che un processo PA sia attualmente in ascolto sulla porta 8081. PA sia in esecuzione nella sessione S1 Ci sono processi PB e PC che appartengono alla stessa sessione di PA. PB e PC funzioneranno su porte diverse (non è importante su quali porte siano in esecuzione)
Il file di comando / batch di Windows dovrebbe prendere 8081 come input e terminare i processi PA, PB e PC.
È possibile? Apprezzo un piccolo aiuto su questo dato che non sono molto esperto in comandi / script in batch.
Il mio tentativo fallito:
(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")
Risposte
In realtà è abbastanza facile in 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 stai cercando batch script
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
)
)
)
Puoi creare una funzione da questo:
function kpn($port){ps|?{$_.sessionID-eq(get-NetTcpConnection -sta listen -loc $port)}|kill -fo -confirm:$false}
E chiamalo come
kpn(8081)