如何在Windows cmd中获取使用端口的特定进程会话下的所有进程

如何在Windows cmd中获取使用端口的特定进程会话下的所有进程

我想列出并终止属于使用端口的特定进程的会话的所有进程。这应该通过接受端口号作为输入的 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)

相关内容