Я хочу перечислить и завершить все процессы, принадлежащие сеансу определенного процесса, который использует порт. Это должно произойти с помощью пакетной команды Windows, которая будет принимать номер порта в качестве входных данных.
Например: предположим, что процесс PA в данный момент прослушивает порт 8081. PA работает в сеансе S1. Существуют процессы PB и PC, принадлежащие к тому же сеансу, что и PA. PB и PC будут работать на разных портах (неважно, на каких портах они работают).
Командный файл Windows/пакетный файл должен принять 8081 в качестве входных данных и завершить процессы PA, PB и PC.
Возможно ли это? Буду признателен за небольшую помощь, так как я не очень хорошо разбираюсь в пакетных командах/скриптах.
Моя неудачная попытка:
(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")
решение1
На самом деле в 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
решение2
Если вы ищете пакетный скрипт
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
)
)
)
решение3
Из этого можно сделать функцию:
function kpn($port){ps|?{$_.sessionID-eq(get-NetTcpConnection -sta listen -loc $port)}|kill -fo -confirm:$false}
И назовите это как
kpn(8081)