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

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

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

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

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


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


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

[1.04a (2017/08/17)]
・機能追加
- FileWatcherの設定に"watchdir-enabled"を追加しました
- コマンドに"message","notification"を追加
- watchに"interval"を追加しました
- マクロに"file_readval","exec","str_substr","str_indexof","str_lastindexof","str_length","str_contains","currentproc"を追加しました

・機能変更
- groupコマンドを廃止し、かわりにfilewatcherコマンドを使用するように変更しました
 ※groupコマンドは従来どおり使用可能ですが、filewatcherコマンドを使用するようにしてください
- 既存のfileexistsマクロに機能を追加しました
- 既存のreplace_strマクロをstr_replaceに変更しました。replace_strは今後使用できません。

・不具合修正
- do process で、パスの通った実行ファイルを指定しても、実行できなかったのを修正しました
- 内包するマクロを正しく置換できなかったのを修正しました



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


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

  watchdir-enabled (true or false)
    FileWatcherのフォルダ監視を有効または無効に設定します。
    無効にした場合、監視対象のフォルダで変更があった場合でも、変更による条件の評価やコマンドの実行を行いません。

    設定:
      true(デフォルト)
        FileWatcherのフォルダ監視を有効にします。
      false
        FileWatcherのフォルダ監視を無効にします。

    書式:
      set watchdir-enabled true


・監視対象の指定
  FileWatcherの監視対象を指定します。
  
  watch (監視対象の種類)
    監視対象の種類を指定し、監視対象を基本構文のとおり、次の行から列挙します。
    一部を除き、マクロは使用できません。
    1つのFileWatcherに複数のwatchを指定できますが、dirは必ず指定してください。

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


  以下、監視対象の種類

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

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

  interval
    決まった時間間隔で、監視対象フォルダ内のすべてのファイルを評価し、コマンドを実行します。
    監視対象フォルダが指定されていない場合や、評価対象ファイルがない場合は、何も実行されません。
    時間間隔は、次の行で秒単位で指定します。複数指定した場合は、最後に指定された数値が適用されます。

    書式:
      # 60秒間隔で実行します。
      watch interval
        60


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

    コマンドの種類:
      message
        任意のメッセージをメッセージボックスで表示します。
      notification
        任意のメッセージをバルーンまたはトースト通知で表示します。
        ※OSまたは設定により表示形式が変わります。

    書式:
      do message
        この行の内容をメッセージボックスで表示します
      do notification
        この行の内容をバルーンで表示します


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

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

  currentproc
    アプリの実行ファイル名と置き換えます。
    このマクロは、file-search-filter設定でも有効であり、この設定に限りuse-macroがfalseの場合でも使用可能です。
    書式:
      $currentproc$
    結果:
      # アプリの実行ファイル名が「FileWatcherManager.exe」のとき
      FileWatcherManager.exe

  file_readval
    任意のファイルを読み込み、読み込んだ文字列と置き換えます。
    ファイルはShift-JISエンコードで開かれます。テキストファイルのみ対応します。
    書式:
      $file_readval(ファイルパス)$
    結果:
      # ファイルがShift-JISテキストファイルで、かつファイルの中身が「テスト」のとき
      テスト

  str_indexof
    指定した文字列から、指定した検索文字列が先頭から何文字目にあるかを示す数値と置き換えます。
    指定した検索文字列がないとき、-1と置き換えます。
    検索文字列の位置は、0から始まる数値で表されます。
    書式:
      $str_indexof(評価対象文字列,検索文字列)$
    結果:
      # $str_indexof(あいうえおあいうえお,うえ)$ としたとき
      2
      # $str_indexof(あいうえおあいうえお,ウエ)$ としたとき
      -1

  str_lastindexof
    指定した文字列から、指定した検索文字列が末尾から何文字目にあるかを示す数値と置き換えます。
    指定した検索文字列がないとき、-1と置き換えます。
    検索文字列の位置は、0から始まる数値で表されます。
    書式:
      $str_lastindexof(評価対象文字列,検索文字列)$
    結果:
      # $str_lastindexof(あいうえおあいうえお,うえ)$ としたとき
      7
      # $str_lastindexof(あいうえおあいうえお,ウエ)$ としたとき
      -1

  str_substr
    指定した文字列から、指定した区間だけ抽出した文字列と置き換えます。
    書式:
      $str_contains(評価対象文字列,開始位置)$
      $str_contains(評価対象文字列,開始位置,文字数)$
      ※開始位置は0から始まる数値で指定します。
    結果:
      # $str_substr(あいうえお,2)$ としたとき、指定した位置以降の文字列を抽出します
      うえお
      # $str_substr(あいうえお,2,2)$ としたとき、指定した位置から指定した文字数だけの文字列を抽出します
      うえ

  str_length
    指定した文字列の文字数と置き換えます。
    書式:
      $str_length(評価対象文字列)$
    結果:
      # $str_length(あいうえお)$ としたとき
      5

  str_contains
    指定した文字列に、任意の文字列が含まれるかどうかの評価結果と置き換えます。
    書式:
      $str_contains(評価対象文字列,評価文字列)$
    結果:
      # $str_contains(あいうえお,うえ)$ としたとき
      true
      # $str_contains(あいうえお,ウエ)$ としたとき
      false

  str_replace
    指定した文字列の内容を、指定した文字列で置き換えます。
    ※旧マクロreplace_str(Ver.1.03)は使用できません。
    書式:
      $str_replace(置換対象文字列,置換前文字列,置換後文字列)$
    結果:
      # $str_replace(あいうえお,うえ,ウエ)$ とし、「あいうえお」の「うえ」を「ウエ」に置き換えるとき
      あいウエお

  exec
    指定したプロセスを、指定した引数で実行し、終了コードと置き換えます。
    プロセスは各ファイルごとに実行され、必ず実行終了まで待機するため、評価対象ファイルが多い場合に時間がかかります。
    また、プロセスの記述は、do process と同じです。
    書式:
      $exec(プロセスと実行時引数)$
    結果:
      # 192.168.1.1にpingを実行した結果、192.168.1.1にpingが通り、pingの終了コードが0であるとき
      # $exec(ping 192.168.1.1)
      0





だいたいやりたいことはできるようになったかと。

今回の変更により、ファイルの内容を取り出して評価やコマンドに適用することができるようになりました。
また、文字列操作系のマクロを追加したほか、マクロの中にマクロがあるような、内包されるマクロ($マクロ1$マクロ2$$ みたいなもの)が正しく動作しない問題を修正したため、いろいろやりたいことができるようになったかと。

ただ、ここまでくると設定やマクロがいろいろありすぎて、わけわかめになりかねませんね。

まぁ、これ以上拡張する予定もあまりないので、今のreadme.txtの内容がほぼ完成形なのではないかと思いますが。

しかーし、これだけやれることが多くなったのに、いまだに1ファイルにつき条件が実質1つだけというのは、アホな話ですよね。
execマクロでプログラムを実行し、実行結果によって動作を変えたいということをしたくても、今の状態では強引な方法以外にやり方がありません。
バッチファイルにやらせれば、できなくはないですが。

この辺の改善は、次のVer.1.05でやるかもね。


それから、ちょっと書いちゃいましたが、execマクロを使うことで、任意のプロセスを実行し、実行結果(終了コード)で条件を評価できるようになりました。

また、指定した時間間隔ごとにFileWatcherを実行するintervalが追加されました。
これにより、監視対象ファイル内にファイルがある限り、指定した時間ごとにコマンドを実行することができます。

逆に言うと、監視対象ファイル内にファイルがない場合には、いくら待ってもコマンドは実行されません。
なら、適当なファイルを・・・と思っても、どうでもいいファイル変更通知でFileWatcherが実行されるのは好ましくありません。

そこで使われるのが、この前追加されたcurrentdirマクロと、今回追加されたcurrentprocマクロ、watchdir-enabled設定です。

ごちゃごちゃ説明するより、スクリプトの例を示すのがわかりやすいですよね。


# groupも使用可能ですが、Ver.1.04からfilewatcherでFileWatcherを定義します
filewatcher check_router
  set ignore-events-when-do-command true
  # 監視フォルダ内のファイル変更による条件判定とコマンド実行を無効化します
  set watchdir-enabled false
  # アプリの実行ファイルのみをファイル検索対象とします
  # 必ず1つだけ存在し、かつ他のファイル変更を無視します
  # 1回だけコマンドを実行したい場合にも有効です
  set file-search-filter $currentproc$
  # サブフォルダは検索対象にしないでください
  set watch-subdir false
  # 監視対象フォルダは、アプリが現在示しているフォルダとします
  watch dir
    $currentdir$
  # 60秒ごとに1回実行します
  watch interval
    60
  # ファイルプロパティを参照するわけではありませんが、現状は定型文なので…
  if file.property
    # 192.168.10.1にpingを飛ばし、対象が存在する場合(=終了コード0)に…
    $exec(ping 192.168.10.1)$ == 0
  then
    # ログにアクセス状態を記録します
    do log
      ルーターにアクセスできる状態です
  else
    # トーストかバルーンでユーザーにアクセス不能を通知します
    do notification
      ルーターにアクセスできません><
    do log
      ルーターにアクセスできません
end-filewatcher



このスクリプトを作成して、実行すると、60秒に1回、ルーターのIPアドレスにPingを打ち、到達すればそれをログに記録、しなければユーザーに通知したうえでログに記録します。

スクリプト実行中にLANケーブルを抜いてみると、動作がわかると思います。
ログに記録しているので、log.txtに書き込まれますが、任意のテキストファイルに書き込みたい場合は、一番ラクな方法はechoを使うやり方だと思います。

do log としているところを、以下のように書けば、ログっぽく状態を書き出すことができます。

do process
  cmd.exe /c echo $current_datetime$ : ルーターにアクセスできる状態です >> router_log.txt


アプリのあるフォルダ上のrouter_log.txtファイルに、アクセス状態を日時情報とともに記録していきます。

なお、echoはコンソールコマンドなので、cmd.exe /c を先頭につける必要があります。


フォルダの中身を監視して、なんらかの処理を行いたい要求は多々あると思います。
実際、私もやりたいことはいろいろあって、そのたびに専用のアプリを作成しているのですが、何より手間で、やっぱいいやという風にアクションをやめてしまうことにもなりかねません。時間もかかりますしね。

それに、複数の監視対象があるとき、それぞれに専用アプリをつくると、画面がウィンドウでごちゃごちゃになったり、タスクバーやタスクトレイがあふれたりしてしまいます。

ただ、だからと言って、ごく普通のフォルダ監視ソフトでは、やりたいことが高度になるにつれて、要件を満たさない場合が多くなります。

簡単かつスマートで、画面が煩雑にならず、かつ高度な条件でフォルダ監視およびタスクの実行を行う・・・ということをできるのが、FileWatcherManagerです。

簡単なスクリプトを書くだけで、フォルダの監視をしたり、多様な後処理をしたりすることができ、応用すればネットワークの監視もできます。

もし、スクリプトを書くことに抵抗がなければ、FileWatcherManagerはきっと、やりたいことができる最高のフォルダ監視ツールになると思います。


・・・先に書けよ、ですか?

今後やることは、だいぶもうなくなったと思っていますが、以下に挙げる内容はさっさと実装するつもりです。たぶん夏休み終わったら更新しなくなるかもしれないので。
1.if文を複数指定可能にする(実質的なorの実装)
2.任意の数式を計算する
3.値に名前を付けて、使いまわしできるようにする
4.複数のスクリプトを1つのFileWatcherManagerで管理できるようにする



おわり。