指定タイトルを持つコマンドプロンプトウィンドウ(cmd.exe ウィンドウ)を Kill する
たとえば「15分後にリマインド」というタイトルを持つ cmd.exe を殺したい場合。
結論
以下のようになる。
for /f "tokens=2" %A in ('tasklist /v ^| findstr /i "15分後にリマインド"') do taskkill /PID %A /f /t
別のタイトルで利用する場合は findstr /i の値を変える。
殺しやすいように cmd.exe ウィンドウ(を表示するバッチファイル)のタイトルをあらかじめ title 命令で変えておくのもアリ。
解説
アプローチ
まず cmd.exe ウィンドウを殺すアプローチは以下となる。
- 1: 「殺したい cmd.exe の PID」を入手する
- 2: PID があれば taskkill コマンドで殺せるので、1: の PID を指定して taskkill する
PID は tasklist /v コマンドで知ることができる。
ただし tasklist は動いてるプロセス全部の情報を出すので、殺したい cmd.exe ウィンドウのみの情報が欲しい。これを findstr /i で抽出する。
抽出すると、以下のような情報になっている。PID が欲しい。
$ tasklist /v | findstr /i "秀丸" Hidemaru.exe 1234 Console 1 9,999 K Running USERNAME 0:12:34 blog.md (更新) - 秀丸
PID は 1234 の部分。
……このあたりを、上手くコマンドを組み合わせて実現すれば良い。
コマンドラインを組み立てる
まずは PID を含む部分を抽出する。
tasklist /v | findstr /i "15分後にリマインド"
この結果から PID 部分だけ取りたい。Linux なら awk コマンドがあるが、Windows にはない。どうするか。for /f token を使う。
for /f "tokens=2" %A in ('tasklist /v ^| findstr /i "15分後にリマインド"') do ……
これで「括弧内の実行結果の 2 番目の要素を %A として取り出す」的な意味になる。ただし括弧内は一部記号のエスケープが必要(パイプ |
前のハット ^
)。……書き方ややこしい。
ともあれ、これで %A に PID が入るので、あとはこれを使って taskkill するコマンドを書く。
for /f "tokens=2" %A in ('tasklist /v ^| findstr /i "15分後にリマインド"') do taskkill /PID %A /f /t
ただし taskkill のオプションとして /f 強制終了と、/t 子プロセスも殺す、の二つが必要。この二つがないと cmd.exe は死なない。