指定タイトルを持つコマンドプロンプトウィンドウ(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 は死なない。

参考