特定のファイルが更新されたかどうかを監視するバッチファイルのサンプルを作りました。
本サンプルでは、C:\Cmd直下に使用するファイルを作成しています。
- バッチファイル :file-update.bat
- 監視するファイル:check.txt
特定のファイルが更新されたことを監視するバッチ
紹介するバッチの動作
本記事で紹介するバッチは、以下のような動作をします。
1. バッチ起動
バッチ(file-update.bat)が起動されると、ファイルが更新されるまで、1秒ごとに”file is not updated…”の文字が出力されます。
2. ファイル更新時
監視しているcheck.txtファイルが更新されると…
“file is updated!!!”が出力されて、バッチ(file-update.bat)が終了します。
上記の図では、バッチを起動するときにコマンドプロンプトではなく、Visual Studio Codeを使用しています。
使用している理由は、Visual Studio Codeだけでソースコードの修正とバッチの実行、両方できるためです。
興味のある方は下記記事からインストールしてみてください。
バッチのソースコード
バッチファイルのソースコードは以下になります。
下記では、“C:\Cmd\check.txt”を監視するファイルとしていますので、各々変更してください。
copy
@echo off
for %%i in (C:\Cmd\check.txt) do set x=%%~ti
:RECHECK
for %%j in (C:\Cmd\check.txt) do set y=%%~tj
if "%x%"=="%y%" (
timeout /t 1 > nul
echo file is not updated...
GOTO RECHECK
)
echo file is updated!!!
- xとyにバッチ起動直後のファイルの更新日時を取得
- ファイル未更新(x=y)の場合には、GOTOを使用して1秒後にyを再度取得
- ファイルが更新(x!=y)されたら処理終了
ソースの内容をさらに詳しく知りたい方は、以下の記事も参照してください。
もう少し改良したバッチ
しかしこのままだと、以下の場合にバッチがずっと動き続けてしまう問題があります。
- 監視するファイル(check.txt)が存在しない場合
- 監視するファイル(check.txt)が更新されない場合
以下では、この2つの問題を改善していきます。
改良したバッチの動作
改良したバッチは以下のような動作をします。
1. ファイルが存在しない場合
監視するファイルが存在しない状態で、バッチ(file-update.bat)を起動すると”file is not existed”が表示され、バッチが動く前に終了します。
2. ファイルが更新されない場合に中断する
バッチを中断するために、もうひとつ別のバッチファイルを使用します。
以下の説明では2つのバッチを、バッチAとバッチBとしています。
バッチA:file-update.bat
バッチB:stop-file-update.bat ←新しく追加
それでは、動きを説明します。
まずは、バッチA(file-update.bat)を起動します。
監視するファイルが更新される前に、別のバッチB(stop-file-update.bat)を起動します。
すると”file-update.bat is stopped”と表示されて、バッチA(file-update.bat)が終了します。
改良したソースコード
上の動きを実現するためにソースコードを修正します。
バッチAのファイルの更新と、バッチBのファイルを新しく追加します。
C:\Cmd直下にファイルを追加します。
- バッチを終了させるバッチ:stop-file-update.bat
改良した“file-update.bat”ファイルのソースコードはこちら。
copy
@echo off
if not exist C:\Cmd\check.txt (
echo file is not existed
exit /B 0
)
for %%i in (C:\Cmd\check.txt) do set x=%%~ti
:RECHECK
for %%j in (C:\Cmd\check.txt) do set y=%%~tj
if "%x%"=="%y%" (
if exist C:\Cmd\stop-bat.txt (
echo file-update.bat is stopped
exit /B 0
)
timeout /t 1 > nul
echo file is not updated...
GOTO RECHECK
)
echo file is updated!!!
新しく追加する“stop-file-update.bat”ファイルのソースコードはこちら。
copy
@echo off
copy nul C:\Cmd\stop-bat.txt > nul
timeout /t 5 > nul
del C:\Cmd\stop-bat.txt > nul
- “If exist“でファイルの存在チェック
- 別のバッチでcheck.txtファイルを作成して、存在した場合には”exit /B 0“でバッチを終了する
ソースの内容をさらに詳しく知りたい方は、以下の記事も参照してください。