web-dev-qa-db-ja.com

Windows:特定のポートで実行されているプロセスを強制終了する最速の方法

私はこのプロセスを何度も繰り返しています。 Windowsマシンでプロセスを強制終了する必要があり、そのポートを知っているだけです。通常、手順は次のとおりです。ポート(例のポート8084)を見てPIDを見つけます。ポートで実行されているプロセスを一覧表示します。

netstat -a -o -n

そして、次のコマンドでそのポートのプロセスを強制終了します

taskkill /F /PID <pid>

このコマンドを1行で実行するためにWindows OSで使用できるパイプなどのようなものはありますか?

11
Armand

このコマンドを1行で実行するためにWindows OSで使用できるパイプなどのようなものはありますか?

cmd.exeとPowerShellはどちらも、あるコマンドから別のコマンドへのパイプをサポートしています。 PowerShellでは次のようになります(これはコマンドラインの1行にあるか、 `を使用してスクリプトの改行をエスケープします):

netstat -ano
 | select -skip 4 
 | % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}} 
 | ? {$_.Fields[1] -match '15120$'}
 | % {taskkill /F /PID $_.Fields[4] }

どこ:

  • Select -skip 4は、最初の4つのヘッダー行をスキップします。 (Selectは、オブジェクトのプロジェクトのようなSQL SELECTを実行するために使用されるSelect-Objectの略です。
  • %Foreach-Objectの略で、パイプライン内の各オブジェクト($_)に対してスクリプトブロックを実行し、スクリプトブロックの結果をパイプラインに出力します。ここでは、最初に入力をフィールドの配列に分割してから、2つのプロパティOriginalの文字列netstatFieldsの文字列を作成したばかりの新しいオブジェクトを作成しています。
  • ?は、スクリプトブロックの結果に基づいてフィルタリングするWhere-Objectの略です。ここでは、2番目のフィールドの最後の正規表現に一致しています(すべてのPowerShellコンテナーはゼロベースです)。

(最後の要素を除いてすべてテスト済み:プロセスの強制終了を開始したくありません:-))。

実際には、これを単純化します。最初のforeach(ヘッダーを無視するように設計されています)から0またはPIDのみを返し、taskkillを呼び出す前にゼロ以外の値でフィルタリングします。これはタイプするのは速くなりますが、PowerShellを知らないと理解するのが難しくなります。

10
Richard

コマンドプロンプトを開いて実行します。

for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a

.batで実行する場合は、%a%% aに置き換えます。

そのポートでリッスンしているものを単に殺したい場合は、他の検索の最後に追加(^ | find "LISTENING")します。

1
Josep Alsina

使用できる便利な機能は次のとおりです。

https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1

killp 8081
1
majkinetor