LinuxのpsコマンドみたいなWindowsのコマンド

WindowにもLinuxのpsコマンドみたいなのがあった。「tasklist」コマンドという。ぜんぜん知らなかった。

C:\WINDOWS\system32>tasklist

イメージ名                   PID セッション名     セッション# メモリ使用量
========================= ====== ================ ======== ============
System Idle Process            0 Console                 0         28 K
System                         4 Console                 0        264 K
・・・略

Windowsでバッチプログラムとか作るときに使えそうだね。条件を指定して一覧を出すことも出来る。

C:\WINDOWS\system32>tasklist /fi "imagename eq postgres.exe"

イメージ名                   PID セッション名     セッション# メモリ使用量
========================= ====== ================ ======== ============
postgres.exe                1264 Console                 0      5,616 K
postgres.exe                1616 Console                 0      3,328 K
postgres.exe                 572 Console                 0      3,716 K
postgres.exe                 832 Console                 0      3,772 K

/fiはフィルターをかけるという意味。その後ろにあるのが条件(フィルター)。「imagename eq postgres.exe」で、イメージ名が「postgres.exe」と一致するものを抽出する。他にもフィルターとして使えるのは、たくさんあるので、tasklist/?で確認。

C:\WINDOWS\system32>tasklist/?

TASKLIST [/S システム [/U ユーザー名 [/P [パスワード]]]]
         [/M [モジュール] | /SVC | /V] [/FI フィルタ] [/FO 形式] [/NH]

説明:
    このコマンド ライン ツールによってローカルまたはリモートのシステム
    で実行されているアプリケーションと関連付けられたタスクまたはプロセスの
    一覧が表示されます。

パラメータ一覧:
   /S    システム            接続するリモート システムを指定します。

   /U    [ドメイン\]ユーザー コマンドを実行するユーザー コンテキストを
                             指定します。

   /P    [パスワード]        提供されたユーザー コンテキストのパスワードを
                             指定します。省略された場合は、入力を要求します。

   /M    [モジュール]        指定されたパターン名に一致する DLL モジュールを
                             読み込んだすべてのタスクの一覧を表示します。モ
                             ジュール名が指定されない場合、それぞれのタスクに
                             よって読み込まれたすべてのモジュールを表示します。

   /SVC                      それぞれのプロセスのサービスを表示します。

   /V                        詳細な情報を表示するように指定します。


   /FI    フィルタ           フィルタによって指定された、与えられた条件に一致
                             するタスクを表示します。

   /FO    形式               出力の形式を指定します。
                             有効な値: "TABLE", "LIST", "CSV"。

   /NH                       出力するときに、"カラム ヘッダー"を
                             表示しないように指定します。
                             "TABLE" と "CSV" のみ有効です。

   /?                        ヘルプまたは使用法を表示します。

フィルタ:
    フィルタ名     有効な演算子             有効な値
    -----------     ---------------             --------------
    STATUS          eq, ne                      RUNNING | NOT RESPONDING
    IMAGENAME       eq, ne                      イメージ名
    PID             eq, ne, gt, lt, ge, le      PID 値
    SESSION         eq, ne, gt, lt, ge, le      セッション番号
    SESSIONNAME     eq, ne                      セッション名
    CPUTIME         eq, ne, gt, lt, ge, le      hh:mm:ss の形式の
                                                CPU 時間です。
                                                hh は、時間、
                                                mm は 分、ss は、秒です。
    MEMUSAGE        eq, ne, gt, lt, ge, le      メモリ使用 (KB)
    USERNAME        eq, ne                      [ドメイン\]ユーザーの形式の
                                                ユーザー名です。
    SERVICES        eq, ne                      サービス名
    WINDOWTITLE     eq, ne                      ウィンドウ タイトル
    MODULES         eq, ne                      DLL 名

例:
    TASKLIST
    TASKLIST /M
    TASKLIST /V
    TASKLIST /SVC
    TASKLIST /M wbem*
    TASKLIST /S システム /FO LIST
    TASKLIST /S システム /U ドメイン\ユーザー名 /FO CSV /NH
    TASKLIST /S システム /U ユーザー名 /P パスワード /FO TABLE /NH
    TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"

なんと、CSV形式でも表示できる。

C:\WINDOWS\system32>tasklist /fi "imagename eq postgres.exe" /fo csv

"イメージ名","PID","セッション名","セッション#","メモリ使用量"
"postgres.exe","1264","Console","0","5,616 K"
"postgres.exe","1616","Console","0","3,328 K"
"postgres.exe","572","Console","0","3,716 K"
"postgres.exe","832","Console","0","3,772 K"

findコマンドと組み合わせて、指定したプロセスがいくつあがってるか調べるには下のようにする。(findでカンマがあった行をカウントするって結構微妙かもしれないけど)因みに「/nh」オプションでヘッダを出力しないようにする。

C:\WINDOWS\system32>tasklist /fi "imagename eq postgres.exe" /fo csv /nh |find "," /c
4

tasklistのほかにもwmicってコマンドでもプロセスが見れる。こっちのほうが高機能かもね。こんな感じ。ふーん。

C:\WINDOWS\system32>wmic process where "name = \"postgres.exe\"" get name,commandline
CommandLine                                                                                    Name
"C:/Program Files/PostgreSQL/8.2/bin/postgres.exe" -D "C:/Program Files/PostgreSQL/8.2/data"   postgres.exe
"C:/Program Files/PostgreSQL/8.2/bin/postgres.exe" "--forklog" "1484" "1488"                   postgres.exe
"C:/Program Files/PostgreSQL/8.2/bin/postgres.exe" "--forkboot" "1456" "-x3" "-y" "template1"  postgres.exe
"C:/Program Files/PostgreSQL/8.2/bin/postgres.exe" "--forkcol" "1480"                          postgres.exe