フォルダを監視したい


昨日のお昼くらいに「バッチファイル フォルダ 監視」という検索キーワードでたどりついた方がいたのですが、そういうスクリプトを書いたことがなかったなと思い、作ってみました。

@ECHO OFF

::***************************
:: 定数をセット
::***************************
SET DIRLIST_ORG="%TEMP%\DIRINFO_ORG.dat"
SET DIRLIST_NOW="%TEMP%\DIRINFO_NOW.dat"

SET FCRESULT="%TEMP%\FCRESULT.dat"

::***************************
:: ユーザ指定値をセット
::***************************
:: チェックしたいフォルダ
SET CHECKDIR="%~dp0"

:: チェックしたい間隔[秒]
SET CHECKINTERVAL=5

:: ファイル一覧を取得
DIR %CHECKDIR% > %DIRLIST_ORG%


:: ユーザからの入力を受け付ける[フォルダ]
ECHO 監視したいフォルダを入力してください[初期値:%CHECKDIR%]
SET /P CHECKDIR=:: ユーザからの入力を受け付ける[チェック間隔]
ECHO 監視する間隔[秒]を入力してください[初期値:%CHECKINTERVAL%]
SET /P CHECKINTERVAL=:CHECKINFO
CLS
ECHO -------------------------------------------------------------------
ECHO ○ [%CHECKDIR%] に変化がないかどうかチェック
ECHO   チェック日時:%DATE% - %TIME%
ECHO -------------------------------------------------------------------
::TYPE %DIRLIST_ORG%
ECHO.

:: 現在のファイル一覧を取得
DIR %CHECKDIR% > %DIRLIST_NOW%

:: ファイル一覧を比較
fc /A /L /C %DIRLIST_ORG% %DIRLIST_NOW% > %FCRESULT%

IF %ERRORLEVEL%.==1. (
:: ビープ音を鳴らす
	ECHO ^G
::	TYPE %FCRESULT%
	TYPE %DIRLIST_NOW%
	ECHO.
	ECHO 続行する場合には何かキーを押してください
	PAUSE > NUL
	COPY /Y %DIRLIST_NOW% %DIRLIST_ORG% > NUL
	GOTO PRWAIT
)

:: 変化がない場合
ECHO 変化なし

:: スリープ代わり
PING -n %CHECKINTERVAL% 127.0.0.1 > NUL

:PRWAIT
GOTO CHECKINFO


処理はとてもシンプルで前回作成したファイルリストと現在のファイルリストを比較して一致しなければその内容を表示するというものです。
見てのとおりとてもシンプルなので解説は不要だと思いますがポイントだけ2点。

    1. ファイルの比較にはfcコマンドを使う
    2. 比較した結果、一致しなかった場合にはビープ音を鳴らす


fcコマンドは指定されたファイルの差異を見つけて比較情報を表示してくれるコマンドです。本当は比較結果も表示したかったのですが、どうも一見して分かりにくいというか今回の用途にはあまり向いていなかったので、あくまでファイルが一致するかどうかのチェックにのみ使用しました*1
fcとfindを組み合わせればもう少しみやすくなるかも知れませんし、外部ツールを使えばさらに見栄えが良く出来るはずですのでこれをベースにぜひ工夫してみてください。


あとはビープ音を鳴らして違いがあるときにはそれを告知するという部分ですが、これは以前書いたまとめ記事にも書いてあるとおり、Ctrl+GをECHOコマンドに渡すことで実現出来ます。
常駐型のプログラム/スクリプトで何か異常を検知した時には、その内容をログに書くのももちろん大事ですが、視覚的/聴覚的な手段でそれを訴えるとより伝わりやすくてとてもよいと思います。


もっといい方法があればトラックバックでもコメントでもいいので教えてください。

*1:fcは両ファイルが一致する場合は0を、一致しない場合は1を返します