エディタで編集したファイルをすかさずアップロードする

WSHがなにやら面白げなのでEmEditorで編集したファイルをすかさずFTPでアップロードするスクリプトを組んでみた。かなり便利かも。

ちなみに、エディタは

wscript.exe "スクリプトのファイル名" "編集中のファイルパス"

という形式でコマンドを打つことが出来れば何でもかまいません。EmEditorならば「ツール->外部ツール->外部ツールの設定->新規制作」で外部ツールの設定画面を出して、「コマンド」に「wscript.exe」、引数に

"スクリプトのファイル名" $(Path)

と入力すればOK。タイトルは適当で良いです。Ctrl+Alt+sにでもバインドしておけば、Ctrl+sで保存した後すぐに押せて良い感じです。

FTP部分は外部コンポーネントを使ったのでBASP21 DLLをダウンロードしてきて適当にインストールしてください。

ではスクリプト部分を

// QuickFTP

/* Settings ============================================================ */
// "Local Folder" : ["FTP Server", "Account", "Password", "Remote Root Directory"]
var DirMap = {"D:\\SERVERS\\HTTP\\ishikawa" : ["s91.xrea.com", "arielworks", "******", "/public_html/ishikawa.arielworks.com"],
              "D:\\SERVERS\\HTTP\\web"      : ["s91.xrea.com", "arielworks", "******", "/public_html/www.arielworks.net"]};
/* ===================================================================== */


var CurrentPath = WScript.Arguments.Item(0);

// sort PathMap (transform into 2D(3D) array)
var DirMap = sortObjectByKeyLength(DirMap);

// select connection setting
var pos;
var ifExist = false;
for (pos in DirMap) {
    var CurrentPathRE = new RegExp("^" + DirMap[pos]["Key"].replace(/\\/g, "\\\\") + "\\\\"); // escape \ (\ -> \\)
    if (CurrentPathRE.test(CurrentPath)) {
        var Server = DirMap[pos]["Value"][0];
        var User   = DirMap[pos]["Value"][1];
        var Pass   = DirMap[pos]["Value"][2];
        var lRoot  = DirMap[pos]["Key"];
        var rRoot  = DirMap[pos]["Value"][3];
        ifExist = true;
        break;
    }
}
if (!ifExist) {
    WScript.Echo("Error: Invalid File Path");
    WScript.Quit();
}

// Put File
var FTP = new ActiveXObject("basp21.FTP");
if (!FTP.Connect(Server, User, Pass)) {
    // C:\HTTP\LocalDocRoot\hoge\index.html -> C:\HTTP\LocalDocRoot\hoge -> \hoge -> /hoge
    var lRootStripEX = new RegExp("^" + lRoot.replace(/\\/g, "\\\\")); // escape \ (\ -> \\)
    var SC = FTP.PutFile(CurrentPath, rRoot + CurrentPath.replace(/\\[^\\]*?$/, "").replace(lRootStripEX, "").replace(/\\/g, "/"));
    if (SC != 1) {
        WScript.Echo("Error: FTP Transfer Error \"" + FTP.GetReply() + "\"");
        FTP.Close();
        WScript.Quit();
    }
} else {
    WScript.Echo("Error: FTP Connection Error \"" + FTP.GetReply() + "\"");
    WScript.Quit();
}

FTP.Close();
WScript.Echo("SUCCESS");
WScript.Quit();


function sortObjectByKeyLength(obj)
{
    var result /*: obj*/ = new Array();
    var key /*: String*/;
    for (key in obj) {
        var Unit /*: obj*/ = new Array();
        Unit["Key"] = key;
        Unit["Value"] = obj[key];
        result.push(Unit);
    }
    result.sort(_sortObjectByKeyLengthCompare);
    return result;
}
function _sortObjectByKeyLengthCompare(a, b)
{
    return b["Key"].length - a["Key"].length;
}

ファイル名は「qftp.js」あたりが適当かと思われます。エディタ以外でも、例えばアップロードするファイルが決まっているなら、デスクトップに専用のショートカットを作っておけばダブルクリックするだけでアップロードすることもできます。

「SUCCESS」とダイアログが表示されれば正常にアップロードが完了しているはずです。

ルートディレクトリ(ローカルなら「C:\」、サーバなら「/」)に直にファイルを置いてあるとエラーになります(この部分の対応は面倒なので放置)。