燈明ブログ

現状は小池啓仁の応援ブログ

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*"