私はこのプロセスを何度も繰り返しています。 Windowsマシンでプロセスを強制終了する必要があり、そのポートを知っているだけです。通常、手順は次のとおりです。ポート(例のポート8084)を見てPIDを見つけます。ポートで実行されているプロセスを一覧表示します。
netstat -a -o -n
そして、次のコマンドでそのポートのプロセスを強制終了します
taskkill /F /PID <pid>
このコマンドを1行で実行するためにWindows OSで使用できるパイプなどのようなものはありますか?
このコマンドを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
の文字列netstat
とFields
の文字列を作成したばかりの新しいオブジェクトを作成しています。?
は、スクリプトブロックの結果に基づいてフィルタリングするWhere-Object
の略です。ここでは、2番目のフィールドの最後の正規表現に一致しています(すべてのPowerShellコンテナーはゼロベースです)。(最後の要素を除いてすべてテスト済み:プロセスの強制終了を開始したくありません:-))。
実際には、これを単純化します。最初のforeach
(ヘッダーを無視するように設計されています)から0またはPIDのみを返し、taskkill
を呼び出す前にゼロ以外の値でフィルタリングします。これはタイプするのは速くなりますが、PowerShellを知らないと理解するのが難しくなります。
コマンドプロンプトを開いて実行します。
for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a
.batで実行する場合は、%aを%% aに置き換えます。
そのポートでリッスンしているものを単に殺したい場合は、他の検索の最後に追加(^ | find "LISTENING")します。
使用できる便利な機能は次のとおりです。
https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1
killp 8081