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