Windowsバッチファイル(.bat)で、プログラムが実行中かどうかプロセスチェックを行い、判定する方法を紹介します。
いくつかサンプルのバッチファイルを作成してみました。
なお、今回作業したバージョンは以下の通りです。
- Windows 10 Pro(64bit)
tasklistとfindコマンドでプロセスチェック
プロセスチェックの方法は、実行中のプロセス一覧を取得する「tasklist」コマンドと、文字列検索の「find」コマンドを組み合わせることでできます。
以下のように、tasklistとfindをパイプ(|)で繋ぎ、目的のプログラムのプロセス名(実行ファイル名)を指定します。
環境変数「ERRORLEVEL」は直前に実行したコマンドのエラーコードが格納されているので、プロセスが実行中でヒットすれば「0」、実行されてなくてヒットしなければ「1」となっています。
これを使用して判定します。
>tasklist | find "notepad.exe"
notepad.exe 2548 Console 4 17,520 K
>echo %ERRORLEVEL%
0
>tasklist | find "notepad.exe"
>echo %ERRORLEVEL%
1
プロセスチェックを行うバッチファイル
ということで、サンプルとして簡単なプロセスチェックを行うバッチファイルを作ってみました。
ここでは、メモ帳が起動中かどうかをチェックしています。
@echo off
rem プロセスチェック
tasklist | find "notepad.exe" > NUL
if %ERRORLEVEL% == 0 (
echo "メモ帳が起動中です。終了してから実行してください。"
) else (
echo "メモ帳を起動します。"
start notepad.exe
)
pause
上記コードのポイントは以下です。
- > NUL … 結果を出力しない。
- startコマンド … 実行する処理が終わるのを待たずに、次へ。
- callコマンド … 実行する処理が終わるのを待って、次へ。
- pause … 処理を一時停止して、メッセージを表示する。> NULを付ければメッセージを出力しないようにできる。
プロセスチェックを行い、強制終了と起動を行うバッチファイル
続いてもう少し複雑に、メモ帳が起動しているかどうかプロセスチェックを行い、強制終了するかどうかをユーザーに確認してから実施し、再起動を行うようにしました。
強制終了のユーザー確認は、「Y」もしくは「YES」(大文字小文字区別しない)が入力された場合に実施しています。
@echo off
rem プロセスチェック
tasklist | find "notepad.exe" > NUL
if %ERRORLEVEL% == 0 (
goto STARTED
) ELSE (
goto START
)
rem 起動済の場合
:STARTED
setlocal
set /p ANSWER="メモ帳が起動中です。終了しますか?(Y/N):"
if /i "%ANSWER%" == "Y" (
goto FORCED
) else if /i "%ANSWER%" == "YES" (
goto FORCED
) else (
echo 処理を中断します。
goto END
)
endlocal
rem 強制終了処理
:FORCED
echo 強制終了します。
taskkill /F /IM notepad.exe /T
rem 起動処理
:START
echo メモ帳を起動します。
start notepad.exe
rem 終了処理
:END
echo 処理を終了します。
pause
上記コードのポイントは以下です。
- set /p XXXXX=”~” … 任意の文字列を入力させる。
- if /i … /i オプションで大文字小文字区別しない。
- setlocal ~ endlocal … 環境変数をその間でのみ有効にする。
- taskkill /F /IM XXXXX /T
- /F … 強制終了
- /IM … プロセスのイメージ名を指定
- /T … 全ての子プロセスも削除
if文入れ子にして遅延環境変数を使用するバッチファイル
最後に、上記バッチファイルのif文を入れ子にしてみました。
この場合、通常の環境変数では想定した値を取れず、遅延環境変数を使用する必要がありました。
これは忘れてしまう。。
ifやforを使用する場合、要注意です。
@echo off
rem プロセスチェック
tasklist | find "notepad.exe" > NUL
if %ERRORLEVEL% == 0 (
setlocal enabledelayedexpansion
set /p ANSWER="メモ帳が起動中です。終了しますか?(Y/N):"
if /i "!ANSWER!" == "Y" (
goto FORCED
) else if /i "!ANSWER!" == "YES" (
goto FORCED
) else (
echo 処理を中断します。
goto END
)
endlocal
) else (
goto START
)
rem 強制終了処理
:FORCED
echo 強制終了します。
taskkill /F /IM notepad.exe /T
rem 起動処理
:START
echo メモ帳を起動します。
start notepad.exe
rem 終了処理
:END
echo 処理を終了します。
pause
上記コードのポイントは以下です。
- setlocal enabledelayedexpansion ~ endlocal … 遅延環境変数を使用する。
- %XXXXX% … 通常の環境変数の参照方法。
- !XXXXX! … 遅延環境変数の参照方法。
最後に
今回は、Windowsバッチファイル(.bat)で、プロセスチェックを行う方法を紹介しました。
プログラムの重複起動を阻止する場合などには使えるかと思います。
コメント