特定のポートを使用しているプログラムを探索して終了させるWindows用のバッチです。
引数に対象となるプロトコルとポートを指定します。複数入力可能です。
以下簡単な処理の説明です。
- 引数からプロトコルとポート番号を取得する
- netstat -anoで出力されたリストと比較し、PIDを取得する
- 対象のPIDをtaskkillを使ってキルする
使い方の例
killprocess.bat UDP:62500-62550 TCP:56000
killprocess.bat
@echo off
:loop
if "%1"=="" goto end
for /f "tokens=1,2,3 delims=:- usebackq" %%i in ('%1') do (
SET PROTOCOL=%%i
SET STARTPORT=%%j
SET ENDPORT=%%k
CALL :killprocess %%i %%j %%k
)
shift
goto loop
:killprocess
setlocal enabledelayedexpansion
for /l %%n in (%2,1,%3) do (
for /f "tokens=1,2,4,5" %%i in ('netstat -ano ^| find ":%%n"') do (
echo %%j | find ":%%n">NUL
if not ERRORLEVEL 1 if %1==%%i (
SET PID=%%k
if /i %1==TCP (
SET PID=%%l
)
echo PROTOCOL:%1 Port:%%n PID:!PID!を終了します。
taskkill /f /pid !PID!
)
)
)
exit /b
endlocal
:end
netstatコマンドで状態を取得しますが、TCPとUDPで出力のされ方が違う(厳密にいえば空白で出力されるので行が変わってくる)ので、以下のように読み込む位置をずらしています。
SET PID=%%k
if /i %1==TCP (
SET PID=%%l
)
複数のポートを使うアプリの場合、複数回KILLされます。