batファイルで多重起動(二重起動)を防止する

バッチファイルで多重起動(二重起動)を抑止するコードを探してみた。

bat 多重|二重 実行|起動 抑止|禁止|防ぐ|防止|できないように|させない - Google 検索

方法として、大まかに2つあった。

方法1:バッチファイル自身を追記モードで開く。

方法2:tsklistコマンドを使って実行している数をチェックする。

たが、方法2はチェックする前に複数起動されるとどれもチェックに引っかかり、行いたい処理が実行できない。よって方法1をベースにブラッシュアップしてみた。

@echo off
set ERRORLEVEL=1
call :main %* 0>>"%~dpnx0" && set ERRORLEVEL=0
if %ERRORLEVEL% neq 0 echo multiple start-up error 1>&2
goto :eof
:main
echo main start
timeout 15
echo main end


ちなみに方法1には、実行中はバッチファイル自体を変更できないという特徴があり、これもメリットでもあるが注意が必要である。不用意にエディタで開いているとすでに実行中であると判断されてしまいます。
これを回避するには、バッチファイル自体を読み取り専用にして、ロック用ファイルは別に開きます。

@echo off
attrib +r %~dpnx0
set ERRORLEVEL=1
call :main %* 0>"%~dpnx0.lock" && set ERRORLEVEL=0
if %ERRORLEVEL% neq 0 (echo multiple start-up error 1>&2) else (del %~dpnx0.lock)
goto :eof
:main
echo main start
timeout 15
echo main end



参考にしたページ

Microsoft製品) コマンドプロンプト:バッチの多重起動を抑制する - YiaoWang

バッチファイルlを2重起動できないようにしたい - その他(プログラミング) 締切済み 【OKWAVE】

バッチファイルの二重起動を防止する。(その2) Windows Script Programming

バッチの二重起動防止 - ひらいて

以上です。