Bagaimana mendapatkan semua proses di bawah sesi dari proses tertentu yang menggunakan port di cmd Windows

Aug 17 2020

Saya ingin membuat daftar dan menghentikan semua proses yang termasuk dalam sesi dari proses tertentu yang menggunakan port. Ini harus terjadi melalui perintah batch windows yang akan menerima nomor port sebagai input.

Sebagai contoh: Misalkan sebuah proses PA sedang mendengarkan pada port 8081. PA sedang berjalan di bawah sesi S1 Ada proses PB dan PC milik sesi yang sama dengan PA. PB dan PC akan berjalan di port yang berbeda (Tidak penting port mana yang mereka jalankan)

Perintah windows / file batch harus mengambil 8081 sebagai input dan mematikan proses PA, PB dan PC.

Apakah ini mungkin? Hargai sedikit bantuan dalam hal ini karena saya tidak terlalu fasih dalam perintah / skrip batch.

Upaya Saya yang Gagal:

(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")

Jawaban

4 GeraldSchneider Aug 17 2020 at 20:28

Itu sebenarnya cukup mudah di 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
1 Vazid Aug 17 2020 at 21:14

Jika Anda mencari skrip batch

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
        )
    )
)
WasifHasan Sep 22 2020 at 09:34

Anda dapat membuat fungsi dari ini:

function kpn($port){ps|?{$_.sessionID-eq(get-NetTcpConnection -sta listen -loc $port)}|kill -fo -confirm:$false}

Dan menyebutnya seperti

kpn(8081)