A Better Project@はてなダイアリー(インポート版)

基本的にここは更新されません。詳細はaboutへ。

拡張子に関連付けされているファイルタイプとプログラムを表示する JScript

コマンドプロンプトで拡張子の関連付けを調べる場合、assoc でファイルタイプを調べて、さらに、ftype でファイルタイプに関連付けられているプログラムを調べるのは面倒だなと思い、作ってみました。Exec メソッドの使い方のメモ用でもあります。標準出力を読みこめるのはそれなりに便利かもしれません。
6 月 30 日 版(詳細は:d:id:potappo:20070630:1183213488

//usage: %0 .extension
var WshShell = WScript.CreateObject("WScript.Shell");
var myExt = WScript.Arguments(0);
var myExecAssoc = WshShell.Exec("cmd /c assoc " + myExt);
var myOutAssoc = myExecAssoc.StdOut.ReadAll();
var myFtype = myOutAssoc.split("=")[1];
var myExecFtype = WshShell.Exec("cmd /c ftype " + myFtype);
var myOutFtype = myExecFtype.StdOut.ReadAll();
if (myOutFtype==""){//ftype が失敗したときは、レジストリに直接アクセスする。
    var myCleanedFtype = myFtype.substring(0, myFtype.length-2);
    var myRegKey = "HKEY_CLASSES_ROOT\\" + myCleanedFtype + "\\Shell\\Open\\Command\\";
    myOutFtype = myCleanedFtype + "=" + WshShell.RegRead(myRegKey);
}
WScript.Echo(myOutFtype);

6 月 29 日版

//usage: %0 .extension
var WshShell = WScript.CreateObject("WScript.Shell");
var myExt = WScript.Arguments(0);
var myExecAssoc = WshShell.Exec("cmd /c assoc " + myExt);
var myOutAssoc = myExecAssoc.StdOut.ReadAll();
var myFtype = myOutAssoc.split("=")[1];
var myExecFtype = WshShell.Exec("cmd /c ftype " + myFtype);
var myOutFtype = myExecFtype.StdOut.ReadAll();
if (myOutFtype==""){ //ftype が失敗したときは、ファイルタイプだけを出力する。
    WScript.Echo(myFtype);
}else WScript.Echo(myOutFtype);

23:20 頃追記

スクリプトを少し修正しました。
登録されている拡張子名を正しく指定したにも関わらず、ftype コマンドが何らかの理由で失敗した場合*1レジストリを直接読むことで、ファイルタイプに関連付けられたプログラムを調べることができます。この処理も上のスクリプトに組み込もうとしたのですが、ファイルタイプを変数とした場合に、レジストリキー名を上手く生成できない(バックスラッシュのエスケープ処理の影響なのかバックスラッシュのせいではなく、変数に標準出力の内容を格納した場合に、上手く処理できないみたいで、文字列と変数をきちんと連結できませんでした最後の改行をきちんと取り除いていないのが原因でした。解決策については、d:id:potappo:20070630:1183213488 を参照してください。)ので、下記のスクリプトのパラメータに「HKCR\ファイルタイプ\Shell\Open\Command\」を指定して実行してください。

var WshShell = WScript.CreateObject("WScript.Shell");
var myRegKey = WScript.Arguments(0);
var myRegValue = WshShell.RegRead(myRegKey);
WScript.Echo(myRegValue);

*1:手元では、ActiveScriptRuby のインスト時に関連付けした .rb を指定すると失敗。関連付け自体はきちんとされているのですが。