Extend Script Toolkitでホットフォルダ運用をする

もし、スクリプト開発をしないマシンで、Extend Script Toolkitがインストールされているなら、それでホットフォルダを運用しませんか? という話。いや、誰もしないのは分かっているんだけど。

まあ、Distillerみたいに、特定のフォルダ(いわゆるホットフォルダ)を監視してて、そこにファイルが入ったら何か処理してくれる、という仕組みをAdobe JavaScriptで実現するにはこうですよというサンプルです。

コードを見ればわかる通り、無限ループになっているので、実行中はExtend Script Toolkitが使えません。なお、このスクリプトをInDesignやIllustratorのスクリプトパネルから実行しないように。InDesignやIllustratorが使えなくなります。名前を変えて「便利なスクリプトだから使ってみて」と人に渡すのはもってのほか。悪用厳禁で願います。

const watchFolderName = "D:\\demo\\input"; //Windowsの場合
const workFolderName = "D:\\demo\\work"; //Windowsの場合
var newFileName = "";
var err = true;
watchFolder = Folder(watchFolderName);
watchLoop :
while (true) {
  tFiles = watchFolder.getFiles();
  if (tFiles.length == 0) {
    $.sleep(2000); //2秒停止。適宜調整
  } else {
    for (i = 0; i < tFiles.length; i++) {
      //終了条件の例。ファイル名がstop.txtだったら終了
      if (tFiles[i].name == "stop.txt") break watchLoop;
      if (File.fs == "Windows") {
        newFileName = workFolderName + "\\" + tFiles[i].name;
        //移動先に同名ファイルがある場合などは失敗します
        if (!tFiles[i].rename(newFileName)) {
          alert("移動に失敗しました" + tFiles[i].name);
          break watchLoop;
        }
      } else {
        newFileName = workFolderName + "/" + tFiles[i].name;
        //コピー先に同名ファイルがある場合などは失敗します
        if (!tFiles[i].copy(newFileName)) {
          alert("コピーに失敗しました" + tFiles[i].name);
          break watchLoop;
        } else {
          //ファイルが開かれていると失敗します 
          if (!tFiles[i].remove()) {
            alert("削除に失敗しました" + tFiles[i].name);
            break watchLoop;
          }
        }
      }
      //ここに実行する処理を記述
      //自作関数だとか、doScript()だとか。引数にnewFileNameを入れてね
      //さらに使用済みファイルの処理も記述してね
    }
  }
  //ここに終了条件を記述することもある
  //例えば夜中の2時になったら終了とか
}
alert("終了しました");

元々は File.rename() が、Windowsの場合はフォルダの移動もできるのに、Macではできないので、それを伝えるためのサンプルだったんだけれど、色々追加していったらこうなっちゃいました。止めるときは監視フォルダに「stop.txt」というファイル(中身はなくてもよい)を突っ込んでやってください。

『Extend Script Toolkitでホットフォルダ運用をする』へのコメント

  1. 名前:なかとじ 投稿日:2017/07/23(日) 06:52:45 ID:abe4f9767 返信

    新しい製品群(CC 2015?)ではJavaScriptエンジンが変更されてjQueryも使えるという話ですので、コールバック系の処理が簡単に出来るんでしょうねぇ。
    私は下位互換のために、#targetengineと.swfファイルを使ってコールバックを実現しています。
    が。CC 2017からは全ての製品からFlashランタイムが排除されたということなので、物によってはCC 2015を堺に2ラインリリースしなければならないかと思うと、面倒になってまた引きこもりになりそうです。