相対パスのファイルを関連付けで開くマクロ

説明

このマクロは、選択状態にある相対パスを関連付けで開くマクロです。実行する際に、それが相対パスかどうかを判断しません。まあ実際にそのファイルが無くても、 エラーダイアログが出るだけです。

「 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 );