【Windows bat】特定のファイルが更新されたことを監視するバッチ

Windows bat ファイル更新を監視するバッチ

特定のファイルが更新されたかどうかを監視するバッチファイルのサンプルを作りました。

使用するファイル

本サンプルでは、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だけでソースコードの修正とバッチの実行、両方できるためです。

興味のある方は下記記事からインストールしてみてください。

関連記事【Windows10】Visual Studio Codeインストール方法

バッチのソースコード

バッチファイルのソースコードは以下になります。

メモ

下記では、“C:\Cmd\check.txt”を監視するファイルとしていますので、各々変更してください。

file-update.bat

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)されたら処理終了

 

ソースの内容をさらに詳しく知りたい方は、以下の記事も参照してください。

もう少し改良したバッチ

しかしこのままだと、以下の場合にバッチがずっと動き続けてしまう問題があります。

問題
  1. 監視するファイル(check.txt)が存在しない場合
  2. 監視するファイル(check.txt)が更新されない場合

以下では、この2つの問題を改善していきます。

改良したバッチの動作

改良したバッチは以下のような動作をします。

1. ファイルが存在しない場合

監視するファイルが存在しない状態で、バッチ(file-update.bat)を起動すると”file is not existed”が表示され、バッチが動く前に終了します。

2. ファイルが更新されない場合に中断する

バッチを中断するために、もうひとつ別のバッチファイルを使用します。

以下の説明では2つのバッチを、バッチAとバッチBとしています。

使用する2つのバッチ

バッチA:file-update.bat

バッチB:stop-file-update.bat ←新しく追加

 

それでは、動きを説明します。

まずは、バッチA(file-update.bat)を起動します。

監視するファイルが更新される前に、別のバッチB(stop-file-update.bat)を起動します。

メモ
バッチAとバッチBは別のコマンドプロンプトで起動しています。

すると”file-update.bat is stopped”と表示されて、バッチA(file-update.bat)が終了します。

改良したソースコード

上の動きを実現するためにソースコードを修正します。

バッチAのファイルの更新と、バッチBのファイルを新しく追加します。

追加するファイル

C:\Cmd直下にファイルを追加します。

  • バッチを終了させるバッチ:stop-file-update.bat

 

改良した“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”ファイルのソースコードはこちら。

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“でバッチを終了する

 

ソースの内容をさらに詳しく知りたい方は、以下の記事も参照してください。