パス・URLを開く コマンドを実行する

提供: MeryWiki
ナビゲーションに移動 検索に移動

概要[編集]

選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。

未選択状態で実行した場合、以下の順序で実行します。

  1. カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
  2. カーソルのある行すべての文字列を対象にして開きます。

Alt+Enter などに設定し、サッと実行できるようにするのがオススメです。

ソースコード[編集]

#title = "パス・URLを開く_コマンドを実行する";

// 選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。
// 未選択状態で実行した場合、以下の順序で実行します。
// 1. カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
// 2. カーソルのある行すべての文字列を対象にして開きます。
//
// (1) パスを開く
//   ファイルパスとして認識できる文字列の場合は、関連付けアプリケーションで開くかMeryで開くかを確認してから開きます。
//   絶対パスにのみ対応しています。
//   (ファイルパスとして認識できる文字列の例)
//     [ローカルファイルパス] C:\Users\username\Desktop\example.txt
//     [ネットワークパス]     \\127.0.0.1\examplefolder\example.txt
// (2) コマンドを実行
//   ファイルパスではない文字列だと判定した場合、コマンドと見なして実行しようとします。
//   これは、「ファイル名を指定して実行」でコマンドを指定して実行するときと同様の動きです。
//   (コマンド実行できる文字列の例)
//     ping 1.1.1.1 -t
//     mstsc /v:172.16.0.1

var doc = document;
var sel = document.Selection;
var wshShell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var BUTTON_OK_CANCEL = 1
var ICON_EXCLAMATION = 48
var ICON_CRITICAL = 16
var SELECT_2 = 256
var RES_OK = 1
var RES_CANCEL = 2

function msgBox(body, title) {
    if (!title) title = body;
    var result = wshShell.Popup(body,
        0,
        title,
        BUTTON_OK_CANCEL + ICON_EXCLAMATION + SELECT_2);
    return result;
}

function errMsg(body) {
    var result = wshShell.Popup(body,
        0,
        'Error!!',
        ICON_CRITICAL);
    return result;
}

function quotePath(path) {
    return '"' + path + '"';
}

function execCommand(text) {
    var result = msgBox('以下のコマンドを実行しますか?\n\n' + text,
        'コマンド確認');
    if (result !== RES_OK) {
        return;
    }
    try {
        if (fso.FileExists(text)) {
            wshShell.Run(quotePath(text));
        } else {
            wshShell.Run(text);
        }
    } catch (e) {
        errMsg('コマンド実行に失敗しました。\n\n[command]\n' + text);
    }
}

function openPath(t) {
    var text = t.trim().replace(/^"([^"]+)"$/g, '$1');
    if (text === '') return;

    if (text.match(/^https?:\/\//)) {
        wshShell.Run(text);
    } else if (text.match(/^#include /)) {
        // Meryマクロ #include ディレクティブを開く
        var filename = text.replace(/^#include\s+/, '').replace(/^['"]|['"]$/g, '');
        var scriptDir = fso.GetFile(doc.FullName).ParentFolder;
        var includeFile = scriptDir + '\\' + filename;
        if (fso.FileExists(includeFile)) {
            wshShell.Run('"' + editor.FullName + '" ' + quotePath(includeFile));
        } else {
            alert("以下のファイルは存在しません。\n\n" + includeFile);
        }
    } else if (text.match(/^([a-zA-Z]:[/\\]|[/\\]{2})/)) {
        // ファイルパス形式の場合
        if (fso.FolderExists(text)) {
            // フォルダの場合
            wshShell.Run(quotePath(text));
        } else if (fso.FileExists(text)) {
            // ファイルの場合
            if (fso.GetFileName(text).match(/\.exe$/)) {
                // exeは実行
                execCommand(text);
            } else {
                // exe以外のファイルを開く
                var menu = CreatePopupMenu();
                menu.Add("関連付けアプリケーションで開く (&1)", 1);
                menu.Add("Mery で開く (&2)", 2);
                menu.Add("", 0, meMenuSeparator);
                menu.Add("キャンセル (&C)", 99);
                menu.Add(text.match(/.*[/\\]([^/\\]+)/)[1], 0, meMenuGrayed);

                var track = menu.Track(0);
                switch (track) {
                    case 1:
                        wshShell.Run(quotePath(text));
                        break;
                    case 2:
                        wshShell.Run('"' + editor.FullName + '" ' + quotePath(text));
                        break;
                }
            }
        }
    } else {
        execCommand(text);
    }
}

function main() {
    var text = sel.Text;

    if (sel.IsEmpty) {
        var x = sel.GetActivePointX(mePosLogical);
        var y = sel.GetActivePointY(mePosLogical);

        // カーソル位置が URL/ファイルパス の場合は既定ブラウザで開いて処理終了
        sel.SelectWord();
        text = sel.Text;
        sel.SetActivePoint(mePosLogical, x, y);
        if (text.match(/^(https?|file):\/\//)) {
            sel.OpenLink();
            return;
        }

        // カーソル位置の行を取得
        text = document.GetLine(y, 0);
    }

    openPath(text);
}

main();
スポンサーリンク