パス・URLを開く コマンドを実行する
ナビゲーションに移動
検索に移動
概要[編集]
選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。
未選択状態で実行した場合、以下の順序で実行します。
- カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
- カーソルのある行すべての文字列を対象にして開きます。
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();
スポンサーリンク