Windows cmd でポートを使用している特定のプロセスのセッション下にあるすべてのプロセスを取得する方法

Windows cmd でポートを使用している特定のプロセスのセッション下にあるすべてのプロセスを取得する方法

ポートを使用している特定のプロセスのセッションに属するすべてのプロセスを一覧表示して終了したいと考えています。これは、ポート番号を入力として受け入れる Windows バッチ コマンドを通じて実行する必要があります。

たとえば、プロセス PA が現在ポート 8081 でリッスンしているとします。PA はセッション S1 で実行されています。PA と同じセッションに属するプロセス PB と PC があります。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)

関連情報