バッチの中で他のプロセスが起動中か確認する

他のプロセスが起動中か確認が必要な場面

このプロセス/アプリが終わってからじゃないと処理ができないとか、このプロセス/アプリが起動中にバッチを実行すると何かを破壊してしまうとかありますよね。そんなときに、プロセス/アプリが起動中か確認する方法を紹介します。



対象となるプロセスを手動で見てみる

起動中かどうか確認したいコマンドやアプリを起動します。その状態でタスクマネージャを起動します。タスクマネージャは、Windows システムツールの中にあります。ここでは、例題としてメモ帳が起動しているかどうか確認してみましょう。

この例では2つのメモ帳が起動されていることが分かります。

でも、バッチの中で “メモ帳” は通用しません。この ”メモ帳” は通称であり、本名と言うのがあります。その本名を調べるには、メモ帳の行の上で、マウスの左ボタンをクリックし、プロパティを開きます。

プロパティ画面が出てきます。

この中の赤で囲った部分が本名です。ずいぶん通称と違います。

バッチの中で、プロセスが起動中か確認するには、この本名を元に探す方法を採ります。


200×200 高速大容量レンタルサーバ10G
mixhost

プロセスリストを取得してみる

現在起動しているプロセスのリストを取得するには、tasklist と言うコマンドを使います。

C:\>tasklist

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0     18,268 K
Registry                       120 Services                   0     19,408 K
smss.exe                       504 Services                   0      1,052 K
csrss.exe                      804 Services                   0      5,024 K
wininit.exe                    876 Services                   0      5,676 K

コマンドプロンプトを起動して、実行すると百行以上出てくると思います。上の例では先頭の数行のみ表示しています。でもこんなにたくさん出てきたら、メモ帳を探すのも苦労します。

メモ帳のプロセスを抜き出す

メモ帳のプロセスのみ抜き出すには、/FI オプションを使い、フィルターを掛けます。フィルターには色々と指定方法がありますが、プロセスのイメージ名を指定する方法でフィルターをかけます。イメージ名は、メモ帳であれば前段で取得した “notepad.exe” のことです。では実行してみましょう

C:\>tasklist /FI "IMAGENAME eq notepad.exe"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
notepad.exe                  12732 Console                    1     22,360 K
notepad.exe                  10920 Console                    1     20,276 K

狙ったとおり “notepad.exe” が2行出てきました。これで、プロセスを確認するテクニックは揃いました。あとはバッチとしてどう組み込むかです。

バッチの中でプロセスが起動中か判定する

バッチの中では対象のプロセスが起動されていたら、バッチを終了するとか、バッチを一時停止するとか色々と場面によって変わってくりかと思います。この例では、起動中であれば、メッセージを出して一時停止する処理にしています。

set PROCIMAGE=notepad.exe
set APLNAME=メモ帳
tasklist /FI "IMAGENAME eq %PROCIMAGE%" | find "%PROCIMAGE%" > NUL
if %errorlevel% == 0 (
    tasklist /FI "IMAGENAME eq %FILEWATCH%"
    echo.
    echo ■■■■■ %APLNAME% が起動されています ■■■■■
    echo 必要であれば %APLNAME% 停止してください
    echo 何かキーを押してください
    pause > nul
)

汎用的に使えるように、1行目と2行目でプロセスイメージ名(本名)とアプリケーション名(通称)を変数にセットしています。

3行目で、プロセスリストにフィルターをかけてプロセスイメージ名のみ抜き出しています。それをパイプで find に渡しています。

4行目では、3行目の最後のコマンド “find” の終了ステータスを判定しています。この例では、プロセスリストの中に “notepad.exe” があると “errorlevel” が 0 になります。

5~10 行目までは、それぞれの用途に合わせて書き換えてお使いください。