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

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

FileWatcherManager Ver.1.00bをリリースしました!

恒例の長期休暇プログラミング。
今回は「FileWatcherManager」です。

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

例えば、こんな感じのスクリプトを書きます。


exec manual-scan

group fileconv
  watch dir
    C:\変換元ファイル置き場
  if file.property
    $filename$ == .+\.avi$
    $is_file_using$ == false
  then
    do process
      avi2mp4.bat "$filepath$" "$filedir$\$filename2$.mp4"
end-group


このスクリプトを書いて、FileWatcherManagerを実行すると、「C:\変換元ファイル置き場」にAVIファイルが追加されるたびに、AVIファイルをMPEG4ファイルに変換するバッチファイルを呼び出します。

その他、詳しいことは、ヘルプファイルに書いてあります。





===============================================
        FileWatcherManager  ver 1.00b       
===============================================

【ソフト名】FileWatcherManager
【 作者 】あさりのみそしる
【 種別 】フリーウェア
【開発環境】Microsoft Visual Studio Community 2017
【動作環境】Microsoft Windows 10
【バージョン】1.00b
【最終更新日】2017/08/13
【ファイル名】FileWatcherManager.exe


---------------------
◇ 概要 ◇
このプログラムは、FileWatcherスクリプトを実行して、
指定したフォルダの更新状況を監視し、更新があった場合は条件に従って
コマンドを実行します。


◇ 動作条件 ◇
・コンピュータ
Microsoft Windows 10
.NET Framework 4.5.2 以上

※ Microsoft Windows 7 / 8 / 8.1 では、動作確認をしていません。


◇ 基本ファイル構成 ◇
・FileWatcherManager.exe    FileWatcherManager 本体
・AMSLibrary.dll            あさりのみそしる基本ライブラリ

・log.txt                   実行ログファイル
・readme.txt                (本書)説明ファイル

(以下はサンプルファイル)
・start.bat                 FileWatcherManager実行バッチファイル
・sample.fws                サンプルスクリプト
・avi2mp4.bat               サンプルスクリプトで使用するバッチファイル


◇ インストール ◇
適当なフォルダにZIPファイルを解凍してください。


◇ アンインストール ◇
フォルダを丸ごと削除してください。


◇ 使用方法 ◇
FileWatcherスクリプトという、専用スクリプトファイルを
FileWatcherManager.exeにドラッグアンドドロップするか、
第1引数でスクリプトファイルのパスを指定して実行してください。

スクリプトファイルの指定がない場合は、default.fwsが使用されますが、
これもない場合は何も実行されずに終了します。

スクリプトが正しく読み込まれると、
ウィンドウは表示されず、タスクトレイに表示されます。

タスクトレイのアイコンを右クリックすると、メニューが表示されます。
メニューの内容は、以下の通りです。
・再開
 スクリプトエンジンの動作を再開します。
 停止していたすべてのFileWatcher(後述)の動作が有効になります。
・停止
 スクリプトエンジンの動作を停止します。
 有効なすべてのFileWatcher(後述)の動作が無効になります。
・スクリプトの再読み込み
 スクリプトを再読み込みして、動作を実行します。
 スクリプトを編集した場合、編集内容が適用されます。
・ヘルプ
 本書を表示します。
・バージョン情報
 バージョン情報を表示します。
・終了
 スクリプトエンジンを終了します。


◇ 用語 ◇
・FileWatcher
 任意のフォルダ内におけるファイルの変更を監視します。
 変更が検出された場合、指定した条件に基づいて変更されたファイルを抽出し、
 抽出されたファイルに対して、指定した処理を実行します。
  通常、更新・変更されたファイルが評価対象になりますが、対象フォルダ内のすべてのファイルを評価対象にすることもできます。
 スクリプトでは、groupとして扱われます。
・スクリプト
 FileWatcherを作成する、本プログラム専用のスクリプトです。
 内容はテキストファイルであり、ファイル名や拡張子に制約はありませんが、
 本プログラムでは特別に「fws」という拡張子を使用しています。
・スクリプトエンジン
 スクリプトを読み込み、作成されたFileWatcherの実行や中断などのコントロールを行います。
・FileWatcherManager
 スクリプトエンジンにスクリプトを入力したり、エンジンの制御に必要なメニューなどのUIを提供します。


◇ スクリプトリファレンス ◇
スクリプトに使用するコマンドや設定について説明します。
Ver.1.00時点では、構文エラーを適切に扱えないため、スクリプトの構文に問題があっても問題個所の把握が難しいです。
エラーがある場合は、log.txtに実行ログが記録されますが、開発者向けログのため解決の手掛かりにならないかもしれません。

書き方については、サンプルで付属しているsample.fwsも参考にしてください。
段落でブロック分けしていますが、スクリプトの可読性向上のためのものであり、必要なものではありません。
(段落をブロックとして認識するようなスクリプトエンジンではありません。)

また、全角スペースは使用しないでください。


・基本構文
# #で始まる行は、コメント行として扱われます
exec (スクリプト実行コマンド)
exec (スクリプト実行コマンド) ... 以降、スクリプト実行コマンドを必要な数だけ1行ずつ列挙する

group (グループ名1)
  set (グループの設定)
  set (グループの設定) ... 以降、グループの設定を必要な数だけ1行ずつ列挙する
  watch (監視対象の種類)
    (監視対象1)
      (監視対象2) ... 以降、監視対象を必要な数だけ1行ずつ列挙する
  if (ファイル検出条件の評価対象)
    (ファイル検出条件1)
      (ファイル検出条件2) ... 以降、ファイル検出条件を必要な数だけ1行ずつ列挙する
  then
    # 検出条件と合致したファイルについて実行する処理
      do (コマンドの種類)
        (実行するコマンド1)
        (実行するコマンド2) ... 以降、実行するコマンドを必要な数だけ1行ずつ列挙する
  else
    # 検出条件と合致しなかったファイルについて実行する処理
      do (コマンドの種類)
        (実行するコマンド1)
        (実行するコマンド2) ... 以降、実行するコマンドを必要な数だけ1行ずつ列挙する
end-group

group (グループ名2)
...
end-group

group (グループ名3) ... 以降、FileWatcherを必要な数だけ作成する


・グループ
  FileWatcherを生成します。

  group (グループ名)
    グループを定義します。定義したグループには、グループ名で指定した名前が付与されます。
    定義された1つのグループから、1つのFileWatcherが作成されます。

    書式:
      group fileconv

  end-group
    直前のgroupで作成されたグループの終わりを明示します。
    省略可能であり、省略した場合は、次のgroupの直前がグループの終わりとなります。

    書式:
      end-group


・グループの設定
  グループ(FileWatcher)の詳細設定を行います。
  ※省略可能
  
  set (グループの設定) (設定値)
    指定したグループの設定に対して、指定した設定値を、FileWatcherに適用します。

    書式:
      set do-process step-by-step
      set ignore-events-when-do-command true
  

  以下、グループの設定の種類

  do-process (プロセスの実行方法)
    指定したプロセスの実行方法で、プロセスを実行します。

    プロセスの実行方法:
      default(デフォルト)
        デフォルトの実行方法。プロセス終了を待たずに、次のプロセスを実行します。
      step-by-step
        実行中のプロセスが終了するまで、次のプロセスを実行しません。
        複数のファイルが検出された場合でも、直前のファイルに対する実行中プロセスが終了するまで
        次のファイルのプロセスを実行しません。

    書式:
      set do-process step-by-step

  watch-subdir (true or false)
    監視対象のフォルダに含まれるサブフォルダ内のファイルを、監視対象に含むかどうか設定します。

    設定:
      true
        サブフォルダを監視対象に含みます。
      false(デフォルト)
        サブフォルダを監視対象から除外します。

    書式:
      set watch-subdir true

  ignore-short-interval-update (true or false)
    前回の検出から短い時間間隔で発生したファイル更新の検出を無視するかどうか設定します。

    設定:
      true
        短時間に発生する検出を無視します。
      false(デフォルト)
        短時間に発生する検出を無視しません。

    書式:
      set ignore-short-interval-update true
  
  ignore-short-interval (更新間隔[ミリ秒], デフォルト 0)
    前回の検出から短い時間間隔で発生したファイル更新の検出を無視する場合、
    この時間間隔がどれだけ短い場合に無視するかをミリ秒単位で指定します。

    書式:
      # 3秒(=3000ミリ秒)以内の検出を無視します
      set ignore-short-interval 3000
      set ignore-short-interval-update true

  always-full-scan (true or false)
    通常、ファイルの作成、更新などがあったファイルに対して、各種評価やコマンド実行が行われますが、
    検出対象フォルダ内(watch-subdirがtrueの場合はサブフォルダ内のファイルを含む)のすべてのファイルを
    評価対象とするかどうか設定します。

    設定:
      true
        すべてのファイルを評価対象とします。
      false(デフォルト)
        作成・更新されたファイルのみ評価対象とします。

    書式:
      set always-full-scan true

  show-do-process-console (true or false)
    do process実行時に、コマンドプロンプトを表示するかどうか設定します。
    ※実行内容によっては、設定と関係なく表示/非表示の場合があります。

    設定:
      true
        コマンドプロンプトを表示します。
      false(デフォルト)
        コマンドプロンプトを表示しません。

    書式:
      set show-do-process-console true

  ignore-events-when-do-command (true or false)
    各FileWatcherについて、コマンド実行中に次のファイル更新の検出が行われた際、これを無視するかどうか設定します。

    設定:
      true
        コマンド実行中の次の更新を無視します。
      false(デフォルト)
        コマンド実行中の次の更新を無視せず、新たにコマンドを実行します。

    書式:
      set ignore-events-when-do-command true

  show-debug-info (true or false)
    デバッグ情報をログに書き出すかどうか設定します。
    スクリプトが正しく動かない場合は、これを有効にして解決の手掛かりにしてください。
    なお、検出されたファイル数が多い場合、ログファイルのファイルサイズがすぐに大きくなってしまいます。
    通常は、falseにしておくことをおすすめします。

    設定:
      true
        デバッグ情報をログに出力します。
      false(デフォルト)
        デバッグ情報をログに出力しません。

    書式:
      set show-debug-info true

  show-using-file-to-log (true or false)
    検出されたファイルが別プロセスで使用中の場合、これをログに書き出すかどうか設定します。
    スクリプトが正しく動かない場合は、これを有効にして解決の手掛かりにしてください。
    なお、検出されたファイル数が多い場合、ログファイルのファイルサイズがすぐに大きくなってしまいます。
    通常は、falseにしておくことをおすすめします。

    設定:
      true
        使用中ファイルの情報をログに出力します。
      false(デフォルト)
        使用中ファイルの情報をログに出力しません。

    書式:
      set show-using-file-to-log true


・スクリプト実行コマンド
  FileWatcherとは無関係に、スクリプトエンジンが実行するコマンドです。
  ※省略可能

  exec (スクリプト実行コマンド)
    指定したスクリプト実行コマンドを実行します。

    書式:
      exec manual-scan


  以下、スクリプト実行コマンドの種類

  manual-scan
    FileWatcherの監視対象フォルダ内の変更や、ファイル検出にかかわらず、
    すべてのFileWatcherについて、それぞれが監視するフォルダ内に含まれるすべてのファイルに対して、
    条件の評価、およびコマンドの実行を行います。
    すべてのFileWatcherの作成が完了した直後に実行されます。


・監視対象の指定
  FileWatcherの監視対象を指定します。
  
  watch (監視対象の種類)
    監視対象の種類を指定し、監視対象を基本構文のとおり、次の行から列挙します。

    書式:
      watch dir
        C:\test1
          C:\test2


  以下、監視対象の種類

  dir
    フォルダ(ディレクトリ)を監視対象とします。
    監視対象のフォルダは、基本構文のとおり、次の行から列挙します。

    書式:
      watch dir
        C:\test1
          C:\test2


・条件
  検出されたそれぞれのファイルについて、条件とマッチした場合について、コマンドを実行します。
  1つのグループに指定できるifコマンドの数は1つですが、条件は複数列挙できます。
  検出したファイルがすべての条件を満たす場合、これについてthen以降の処理を実行します。
  1つでも条件を満たさない場合は、else以降の処理を実行します。
  
  if (ファイル検出条件の評価対象)
    指定したファイル検出条件の評価対象から、条件を指定します。
    条件は、基本構文のとおり、次の行から列挙します。
    ifのあとには、then または else のいずれか、または両方を必ず指定してください。

    ファイル検出条件の評価対象:
      file.property
        ファイルプロパティを評価対象とします。

    条件式の演算子:
      演算子は以下のものに対応しています。
      記述する際は、演算子の両側に半角スペースを入れてください。
      1行に複数の演算子を使用することはできません。

      (左辺) == (右辺) 左辺と右辺が一致する。正規表現で比較します。 大文字、小文字の違いは無視されます。
      (左辺) != (右辺) 左辺と右辺が一致しない。正規表現で比較します。大文字、小文字の違いは無視されます。
      (左辺) < (右辺) 左辺の値は右辺より小さい。数値として比較します。
      (左辺) > (右辺) 左辺の値は右辺より大きい。数値として比較します。
      (左辺) <= (右辺) 左辺の値は右辺と等しいか、右辺より小さい。数値として比較します。
      (左辺) >= (右辺) 左辺の値は右辺と等しいか、右辺より大きい。数値として比較します。
    
    書式:
      評価対象のファイルがAVIファイルかつ、ファイルが使用中でない場合に、コマンドを実行するとき
      if file.property
        $filename$ == .+\.avi$
        $is_file_using$ != true

  then
    ファイル検出条件をすべて満たす場合に実行するコマンドを、次の行から列挙します。
    ifのあとには、then または else のいずれか、または両方を必ず指定してください。

    書式:
      then
        do process

  else
    ファイル検出条件を1つでも満たさない場合に実行するコマンドを、次の行から列挙します。
    ifのあとには、then または else のいずれか、または両方を必ず指定してください。

    書式:
      else
        do process


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

    コマンドの種類:
      process
        指定したプロセスを、指定した引数で実行します。
      move (またはmv)
        指定した1つのファイルまたはフォルダを移動します。
        移動元と移動先の指定は、「=>」で区切ります。
      copy (またはcp)
        指定した1つのファイルをコピーします。フォルダはコピーできません。
        コピー元とコピー先の指定は、「=>」で区切ります。
      re-evaluation
        すべてのファイルの評価が終わった後、再評価します。
        再評価で検出されたすべてのファイルについては、再びコマンドを実行します。
      nothing
        何も実行しないことを明示します。

    書式:
      do process
        # 最初に実行ファイルを指定し、続いて引数を指定します。
        avi2mp4.bat $filename$ $filedir$\$filename2$.mp4
        # 作成したファイルを既定のプレイヤーで再生します。
        $filedir$\$filename2$.mp4
      do move
        # 移動元ファイル名 => 移動先ファイル名
        $filepath$ => C:\temp
      do copy
        # コピー元ファイル名 => コピー先ファイル名
        $filepath$ => C:\temp
      do re-evaluation
        # 再評価します
      do nothing
        # 何もしません


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

  マクロは、マクロ名の両側を「$」で囲って使用します。
  使用可能なマクロは、以下の通り。

  filename
    評価対象のファイル名と置き換えます。
    ファイル名部分のみ抽出します。
    書式:
      $filename$
    結果:
      評価対象ファイルが「C:\test1\sample.txt」のとき
      sample.txt

  filename2
    評価対象のファイル名と置き換えます。
    拡張子を除いたファイル名部分のみ抽出します。
    書式:
      $filename2$
    結果:
      評価対象ファイルが「C:\test1\sample.txt」のとき
      sample

  filepath
    評価対象のファイルパスと置き換えます。
    書式:
      $filepath$
    結果:
      評価対象ファイルが「C:\test1\sample.txt」のとき
      C:\test1\sample.txt

  fileext
    評価対象のファイル拡張子と置き換えます。
    書式:
      $fileext$
    結果:
      評価対象ファイルが「C:\test1\sample.txt」のとき
      .txt

  filedir
    評価対象のファイルのフォルダパスと置き換えます。
    書式:
      $filedir$
    結果:
      評価対象ファイルが「C:\test1\sample.txt」のとき
      C:\test1

  fileexists
    評価対象のファイルの有無と置き換えます。
    書式:
      $filedir$
    結果:
      評価対象ファイル「C:\test1\sample.txt」が存在するとき
      true
      存在しないとき
      false

  is_file_using
    評価対象のファイルが使用中かどうかの評価結果と置き換えます。
    書式:
      $is_file_using$
    結果:
      評価対象ファイル「C:\test1\sample.txt」が他のプロセスで使用中のとき
      true
      使用中でないとき
      false

  filesize
    評価対象のファイルサイズ(バイト単位)と置き換えます。
    書式:
      $filesize$
    結果:
      評価対象ファイル「C:\test1\sample.txt」のサイズが128KByteのとき
      128000

  elapsed_last_access_days
    評価対象のファイルの最終アクセス日時からの経過日数と置き換えます。
    書式:
      $elapsed_last_access_days$
    結果:
      評価対象ファイル「C:\test1\sample.txt」の最終アクセス日時から30日経過しているとき
      30

  filename_contains
    ファイル名に指定した文字列が含まれるかどうかの評価結果と置き換えます。
    書式:
      $filename_contains(評価文字列)$
    結果:
      評価対象ファイルが「C:\test1\sample.txt」のとき
      $filename_contains(amp)$  の場合、「amp」はファイル名に含まるため
      true
      $filename_contains(ppp)$  の場合、「ppp」はファイル名に含まれないため
      false

  get_drive_available_free_space
    指定したドライブレターのユーザーが使用可能な空き容量(バイト単位)と置き換えます。
    書式:
      $get_drive_available_free_space(ドライブレター)$
    結果:
      $get_drive_available_free_space(C:\)$  かつ、Cドライブの空き容量が500MBのとき
      500000000

  get_drive_total_free_space
    指定したドライブレターの使用可能な全体の空き容量(バイト単位)と置き換えます。
    書式:
      $get_drive_total_free_space(ドライブレター)$
    結果:
      $get_drive_total_free_space(C:\)$  かつ、Cドライブの空き容量が500MBのとき
      500000000

  get_drive_total_size
    指定したドライブレターの使用済み容量(バイト単位)と置き換えます。
    書式:
      $get_drive_total_size(ドライブレター)$
    結果:
      $get_drive_total_size(C:\)$  かつ、Cドライブの使用済み容量が500MBのとき
      500000000

  get_drive_letter_from_volume_label
    指定したボリュームラベルと一致するドライブレターと置き換えます。
    書式:
      $get_drive_letter_from_volume_label(ボリュームラベル)$
    結果:
      $get_drive_letter_from_volume_label(Windows)$  かつ、Cドライブのボリュームラベルが「Windows」のとき
      C:\

  get_dir_total_size
    指定したフォルダの使用容量(バイト単位)と置き換えます。
    サブフォルダを含みます。
    書式:
      $get_dir_total_size(フォルダパス)$
    結果:
      $get_dir_total_size(C:\temp)$  かつ、C:\temp の使用容量が500MBのとき
      500000000

  get_oldest_file
    指定したフォルダに含まれるファイルのうち、最も最終書き込み日時の古いファイルパスと置き換えます。
    ただし、サブフォルダは含みません。
    書式:
      $get_oldest_file(フォルダパス)$
    結果:
      $get_oldest_file(C:\temp)$  かつ、C:\temp の最も古いファイルがtest.aviのとき
      C:\temp\test.avi

・その他
  # (コメント)
    コメント行です。
    書式:
      # これは、コメントです。
      # set show-using-file-to-log true 


◇ サンプル ◇
以下のサイトからFFMPEGをダウンロードし、ffmpegフォルダ内にffmpeg.exeを配置してください。
・FFmpeg

スクリプト内で指定されたフォルダから、AVIファイルを検出すると、自動的にAVIファイルをMPEG4(H.264)に変換します。


◇ 免責 ◇
本プログラムの使用により発生した不具合、動作不良、損害、費用やその他の問題(データの損失等)について、
あさりのみそしるは一切の責任・負担を負わないものとします。

また作者はバージョンアップ、不具合修正の義務を負いません。


----------
◇ 連絡先 ◇
不具合報告や意見・要望等は、ブログのコメント欄までお願いします!


◇ 履歴 ◇

[1.00b (2017/08/13)]
・正式リリース版







ダウンロードはこちらから。

○ イメージ 1 FileWatcherManager
http://space.geocities.jp/asari_no_miso_soup/blog/app/filewatchermanager/FileWatcherManager_ver.1.00b.zip

※初回リリースのver.1.00aは、一部ファイルに問題があったため、ver.1.00bに差し替えました。


すべての機能をチェックしていないため、もしかしたら不具合があるかもしれません。
本実行の前に、必ず動作テストをしてください!

たぶん、自分が必要とする範囲でバージョンアップはする予定です。
要望などあれば、もしかしたら実装するかもしれません。