あさりのみそしるダイアリー

非常事態が日常です…そんな時こそ声を上げないと人生ジエンドにゃん(´・ω・`)

FileWatcherManager Ver.1.02aをリリースしました!

一昨日公開した「FileWatcherManager」に機能追加と不具合修正をしました。

ちなみに「FileWatcherManager」は、指定したフォルダを監視して、変更があれば指定したコマンドを実行します。
フォルダの指定などは、すべて専用のスクリプトで行います。


○ FileWatcherManager Ver.1.00bをリリースしました! ( ソフトウェア ) - あさりのみそしるダイアリー - Yahoo!ブログ


変更内容は以下のとおり。

[1.02a (2017/08/15)]
・機能追加
- FileWatcher(グループ)の設定に"file-search-filter","use-macro"を追加
- コマンドに"make-filelist","log"を追加
- マクロに"currentdir"を追加
- 現在日時との置換関係のマクロを追加

・機能変更
- ifコマンドは省略可能になりました

・不具合修正
- コマンドcopy,move にマクロが適用されていなかったのを修正 
- コマンドre-evaluation が動作しなかったのを修正
- スクリプトファイルが見つからないときの動作が不安定になるのを修正



今回追加されたマクロなどは、以下のとおり。


・グループの設定
  グループ(FileWatcher)の詳細設定を行います。

  file-search-filter (検索パターン, デフォルト *)
    デフォルトでは、監視対象フォルダ内のすべてのファイルに対して、条件の評価とコマンドの実行を行いますが、
    フィルタを指定することで、ファイルパターンと合致するファイルのみ、条件の評価とコマンドの実行を行います。
    正規表現ではなく、ワイルドカード形式で指定してください。
    例えば、複数の種類のファイルが混在する監視対象フォルダに対して、常にAVIファイルのみを評価対象とする場合は、
    *.aviとすることで、評価にかかる時間を短縮することができます。
    
    書式:
      # 常にAVIファイルのみを評価対象とし、それ以外のファイルは対象から除外します。
      set file-search-filter *.avi

  use-macro (true or false)
    マクロを使用するかどうか設定します。
    スクリプト中でマクロを使用しない場合、これをfalseとすることで、評価にかかる時間が短縮されます。
    ただし、ファイルが使用中かどうか評価されないため、"show-using-file-to-log"が強制的に無効になります。

    設定:
      true
        マクロを使用します。
      false(デフォルト)
        マクロを使用しません。

    書式:
      set use-macro true


・コマンド
  各ファイルに対して実行するコマンドです。
  doコマンドは、1つのグループに複数設定できます。
  1つのdoコマンド内に、複数のコマンドを含む場合は、最初に指定したコマンドから順に実行されます。
  複数のdoコマンドを含む場合は、最初のdoコマンドについて、これに含まれるコマンドから順に実行されます。
  
  do (コマンドの種類)
    指定したコマンドの種類から、コマンドを指定します。
    コマンドは、基本構文のとおり、次の行から列挙します。

    コマンドの種類:
      make-filelist
        検出したファイルのうち、条件と合致するファイルのリストを作成します。
      log
        ログファイルに任意のメッセージを出力します。

    書式:
      do make-filelist
        # ファイルリスト名(フルパスまたはファイル名)
        filelist.txt
      do log
        この行の内容をログに記録します


・マクロ
  条件やコマンドの指定には、マクロを使用できます。
  マクロを使うことで、より多様な条件の評価やコマンドの実行を行うことができます。
  ※ただし、一部条件下を除き、use-macroがfalseのとき、マクロは実行されません。
  
  マクロは、行中の文字列の置換機能です。
  決まった書式で書かれた文字列を、ファイル名や数値などと置き換えます。

  マクロは、マクロ名の両側を「$」で囲って使用します。
  使用可能なマクロは、以下のとおり。
  
  currentdir
    アプリが現在示しているフォルダパスと置き換えます。
    このマクロは、watchコマンドでも有効であり、かつuse-macroがfalseの場合でも使用可能です。
    書式:
      $currentdir$
    結果:
      アプリが現在示しているフォルダパスが「C:\test1」のとき
      C:\test1

  date_yyyy, date_yyy, date_yy, date_y
    現在の日付のうち、年を示す数値と置き換えます。下位1桁目からyの数だけ数値を取り出します。
  書式:
    $date_yyyy$
  結果:
    現在の日付が2017年8月15日のとき
    2017

  date_mm, date_m
    現在の日付のうち、月を示す数値と置き換えます。mmの場合、1桁のとき0詰めします。
  書式:
    $date_mm$
  結果:
    現在の日付が2017年8月15日のとき
    08

  date_dd, date_d
    現在の日付のうち、日を示す数値と置き換えます。ddの場合、1桁のとき0詰めします。
  書式:
    $date_dd$
  結果:
    現在の日付が2017年8月15日のとき
    15

  time_hh, time_h
    現在の時刻のうち、時を示す数値と置き換えます。hhの場合、1桁のとき0詰めします。
  書式:
    $time_hh$
  結果:
    現在の時刻が0時15分30秒のとき
    00

  time_mm, time_m
    現在の時刻のうち、分を示す数値と置き換えます。mmの場合、1桁のとき0詰めします。
  書式:
    $time_mm$
  結果:
    現在の時刻が0時15分30秒のとき
    15

  time_ss, time_s
    現在の時刻のうち、秒を示す数値と置き換えます。ssの場合、1桁のとき0詰めします。
  書式:
    $time_ss$
  結果:
    現在の時刻が0時15分30秒のとき
    30





今回の変更により、監視先フォルダ内のファイルリストを取得して、リストを使って何かをするということができるようになります。

たとえば、こんな感じのスクリプトをかくことができます。

exec manual-scan

group filescan
  set watch-subdir true
  set always-full-scan true
  set ignore-short-interval-update true
  set ignore-short-interval 1000
  set ignore-events-when-do-command true
  # マクロを使わない場合は、falseにしておくと早く処理できる
  set use-macro false
  watch dir
    \\(NASのIPアドレス)\disk1\ip_cam_recorder\IPCamera_Record
  do make-filelist
    # ファイル名のみの場合、FileWatcherManager.exeと同じフォルダに作成される
    filelist.txt
end-group

group log_list_updated
  set watch-subdir true
  set always-full-scan true
  # 前回の変更検出から30秒以内の変更は無視する
  set ignore-short-interval-update true
  set ignore-short-interval 30000
  set ignore-events-when-do-command true
  set use-macro false
  # 監視対象フォルダ内の、filelist.txtのみを監視対象とする
  set file-search-filter filelist.txt
  watch dir
    # FileWatcherManager.exeと同じフォルダを監視する
    $currentdir$
  # ifを省略すると、監視対象フォルダ内で変更が検出されるたびに必ず実行する
  do log
    ファイルログが更新された
  # バッチファイルを実行する場合は、以下のように書く。
  # do process
  #   test.bat filelist.txt
end-group



これにより、
ファイルウォッチャfilescanは、
\\(NASのIPアドレス)\disk1\ip_cam_recorder\IPCamera_Record
以下にあるすべてのファイルを検出し、これを
filelist.txt
に列挙します。

また、別のファイルウォッチャlog_list_updatedは、
filelist.txtの変更を検出すると、
ログファイルに「ファイルログが更新された」と記録します。
ログをするかわりに、filelist.txtにもとづいて何らかの処理をすることもできます。

このスクリプトを実行することで、任意のフォルダに含まれるファイルリストを、変更があるたびにFTPサーバーにアップロードするということも可能になります。

フォルダに含まれるファイルの数が多いと、filelist.txtの作成が完了するまでに時間がかかり、その間、頻繁にfilelist.txtが更新されるため、filelist.txtの更新を検知するファイルウォッチャが何度も反応してしまいます。

これを回避するために、前回の更新から30秒ほど、更新を無視するようにします。

また、ファイルリスト作成と同じファイルウォッチャで、検出したファイルに何らかのプロセスを実行させると、ファイルリストの作成が完了するまでになおさら時間がかかってしまいます。
そのため、ファイルリストを作成する場合は、専用のファイルウォッチャを用意することをおすすめします。




おわり。