このマクロは、選択状態にある相対パスを関連付けで開くマクロです。実行する際に、それが相対パスかどうかを判断しません。まあ実際にそのファイルが無くても、 エラーダイアログが出るだけです。
「 Run の後に実行ファイル名をつけないと、関連付けでそのファイルを開く」という事を知ったので、書いてみました。が、僕の環境だと HTML ファイルなどは Donut に関連付けしてあっても IE で開きます。全くの予想ですが、レジストリの「Open」で開いているのでないかと。開くアプリを指定したい場合は、最後の行を WshShell.Run( '"アプリのフルパス" ' + AbsolutePath );
として下さい。
一応きちんと動いてますが、文法的におかしい所などがありましたら、指摘していただけるとありがたいです。
// パスがスラッシュで終わってるときに、ファイル名をつけるかどうか
// つけるなら1、ディレクトリを指定するなら0.
var slashend = 0;
// 上のが1の場合、つけるファイル名を書く
var indexfilename = "index.html";
//
//====設定おしまい====
WshShell = new ActiveXObject( "WScript.Shell" );
var base = document.FullName;
var pathn = document.selection.text;
var r = new RegExp("/","g");
pathn = pathn.replace(r, "\\");//"/"を"\"に変換
var rep = /^\.\\/g;
var headslash = pathn.match(rep);//行頭の"./"を探す
if (headslash != null){
pathn = pathn.replace(rep, "");//あったら消す
}
function joinPath(base,pathn)//相対パスを絶対パスに変換
{
if(base.substr(base.length-1) != '\\'){
base = base.split('\\');
base.length--;
base = base.join('\\');
}else{
base = base.substr(0,base.length-1);
}
base = base.split('\\');
while(0 == pathn.indexOf('..\\')){
base.length--;
pathn = pathn.substr(3);
}
base = base.join('\\');
base = base + '\\' + pathn;
return base;
}
var AbsolutePath = joinPath(base,pathn);
var baselength = AbsolutePath.length;//選択したパスの長さを計測
var slashpos = AbsolutePath.lastIndexOf("\\");//\を後ろから検索
if (slashpos + 1 == baselength){//パスが\で終わっていたら
if (slashend == 1){
AbsolutePath = AbsolutePath + indexfilename;//ケツに足す
}
}
WshShell.Run( AbsolutePath );