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

提供: MeryWiki
2023年7月2日 (日) 08:27時点におけるYuko (トーク | 投稿記録)による版 (ページの作成:「選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。 未選択状態で実行した場合、カーソルのある行すべての文字列を対象にして開きます。 <syntaxhighlight lang="javascript"> #title = "パス・URLを開く_コマンドを実行する"; // 選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。 // 未選択状態で実行した場…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。 未選択状態で実行した場合、カーソルのある行すべての文字列を対象にして開きます。

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

// 選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。
// 未選択状態で実行した場合、カーソルのある行すべての文字列を対象にして開きます。
// (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 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(/^([a-zA-Z]:[/\\]|[/\\]{2})/)) {
        if (fso.FolderExists(text)) {
            wshShell.Run(quotePath(text));
        } else if (fso.FileExists(text)) {
            if (fso.GetFileName(text).match(/\.exe$/)) {
                execCommand(text);
            } else {
                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() {
    if (sel.IsEmpty) {
        var x = sel.GetActivePointX(mePosLogical);
        var y = sel.GetActivePointY(mePosLogical);

        sel.SelectWord();
        var text = sel.Text;
        sel.SetActivePoint(mePosLogical, x, y);
        if (text.match(/^https?:\/\//)) {
            wshShell.Run(text);
            return;
        }
        
        text = document.GetLine(y, 0);
        openPath(text);
        
        return;
    }
    
    openPath(sel.Text);
}

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