Perlでtaskkill for Windows
Excelのプロセスなど、たまに残ってしまうことがあります。
そんな時は、以下のサンプルでそのプロセスを強制終了させることができます。
◆サンプルソース
use strict; use warnings; # ユーザ名 papa タスク名 EXCEL.EXE taskkill('papa', 'EXCEL.EXE'); sub taskkill { my ($username, $taskname) = @_; $/ = undef; open(my $fh, "tasklist /FI \"USERNAME eq $username\" /FI \"IMAGENAME eq $taskname\" 2>&1 |") or die "open error($!)"; my $process = <$fh>; close($fh); if ($process =~ /$taskname/) { system("taskkill /F /FI \"USERNAME eq $username\" /FI \"IMAGENAME eq $taskname\" > nul 2>&1") and die "system error"; } }
◆留意点
- 『$/ = undef』は、openしたものを全体的に一気にスカラーで読み込みむ指定。
- 今回に限っては、openで3つの引数『open(my $fh, '<', "tasklil・・・』だと、なぜかエラーになる。
- 『> nul 2>&1』は『2>&1 > nul』だとNG。
- また、『nul』は『null』ではない。
◆taskkillコマンドヘルプ引用
TASKKILL [/S システム [/U ユーザー名 [/P [パスワード]]]] { [/FI フィルタ] [/PID プロセスID | /IM イメージ名] } [/F] 説明: このコマンド ライン ツールは、複数のプロセスを終了するために使われます。 プロセス ID またはイメージ名を使って終了できます。 パラメータ一覧: /S システム 接続するリモート システムを指定します。 /U [ドメイン\]ユーザー コマンドが実行されるユーザー コンテキストを 指定します。 /P [パスワード] 提供されるユーザー コンテキストのパスワードを 指定します。省略された場合は、入力を要求します。 /F プロセスの強制終了を指定します。 /FI フィルタ フィルタによって指定された、与えられた条件に一致 するタスクを表示します。 /PID プロセスID 終了させるプロセスの PID を指定します。 /IM イメージ名 終了させるプロセスのイメージ名を指定します。 ワイルドカード '*' を使用してすべてのイメージ名を 指定できます。 /T ツリー削除: 指定したプロセスとそのプロセスが開始 したすべてのプロセスを削除します。 /? このヘルプまたは使用法を表示します。 フィルタ: フィルタ名 有効な演算子 有効な値 ----------- --------------- -------------- STATUS eq, ne RUNNING | NOT RESPONDING IMAGENAME eq, ne イメージ名 PID eq, ne, gt, lt, ge, le PID 値 SESSION eq, ne, gt, lt, ge, le セッション番号です。 CPUTIME eq, ne, gt, lt, ge, le 次の形式の CPU 時間 hh:mm:ss hh - 時間 mm - 分、ss - 秒 MEMUSAGE eq, ne, gt, lt, ge, le メモリ使用量 (KB) USERNAME eq, ne [ドメイン\]ユーザー の形式の ユーザー名です MODULES eq, ne DLL 名 SERVICES eq, ne サービス名 WINDOWTITLE eq, ne ウィンドウのタイトル 注意: /IM スイッチのワイルドカード '*' は、フィルタと使うときのみ有効に なります。 注意: リモート プロセスの終了は、/F オプションの指定したかどうか にかかわりなく強制的に実行されます。 例: TASKKILL /S system /F /IM notepad.exe /T TASKKILL /PID 1230 /PID 1241 /PID 1253 /T TASKKILL /F /IM notepad.exe /IM mspaint.exe TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*" TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM * TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"