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」というファイル(中身はなくてもよい)を突っ込んでやってください。