Mery 関連付け

提供: MeryWiki
移動先: 案内検索

概要

列挙した拡張子を Mery に関連付けるための .reg ファイルコードを生成します.

Mery2 移行時に

 「関連付けがおかしい」

 「半角スペースを含むファイルが開けない」

という方はお試しください.

使用上の注意

このマクロが生成するコードはレジストリを操作するためのコードです.

他の関連付け変更ツールに対して特別リスクが高いとは思いませんが, レジストリを操作することによるリスクはご承知ください.

不安な方は kuro さんが紹介されていた下記ソフトなどをお使いください.

http://www.gigafree.net/system/association/anterix.html

動作環境

Mery: ver 2.0.12.4050

OS: Windows XP SP3,Windows 7 SP1 (64bit)

使用方法

1. 関連付けたい拡張子をエディタ上に列挙する.

例:

txt
c
cpp
h

2. マクロを実行する.

3. 2 つの『無題』が作成される. 直後にアクティブになっている方が「登録用」のコード,もう一方が「登録解除用」のコード.

4. それぞれを適当なファイル(ただし拡張子は「.reg」)に保存し,「登録用」のコードをエクスプローラー上で実行.

 ⇒関連付けされる

* 関連付けが不要になった場合は「登録解除用」のコードを実行.

 ⇒「登録用」コード実行前の関連付けに戻る

コード

// -----------------------------------------------------------------------------
// CreateAssociationRegister.js
//
// 列挙されている拡張子を Mery に関連付けるための .reg ファイルのコードを
// 生成します.
// テキストは登録用と登録解除用の 2 つが生成されます.
// 登録時には対となる登録解除用のコードを必ず保存しておいてください.
//
// 生成されたコードを .reg ファイルに保存して実行することで関連付けされます.
// レジストリを操作するため,その危険性は十分にご承知の上お使いください.
//
// このプログラムは以下のライセンスに従って公開されます.
//   クリエイティブ・コモンズ
//     http://creativecommons.org/licenses/by/2.1/jp/
//
// このプログラムには以下のコードを含んでいます.
//   "jscriptから WMIを使ってレジストリキー/値列挙"
//     (C) tckz
//     http://passing.breeze.cc/mt/archives/2009/07/jscript-wmi.html
//
// (C) ks
// http://merysmacro.seesaa.net/
// -----------------------------------------------------------------------------
 
var Registry = function () {
  this.initialize.apply(this, arguments);
};
Registry.prototype = {
  initialize: function(computer) {
    var locator = new ActiveXObject("WbemScripting.SWbemLocator");
    var server = locator.ConnectServer(computer, "root\\default");
    this.stdregprov = server.Get("StdRegProv");
 
    this.HKCR = 0x80000000;    // HKEY_CLASSES_ROOT
    this.HKCU = 0x80000001;    // HKEY_CURRENT_USER
  },
 
  do_method: function(method_name, hkey, key, value_name) {
    var in_param = this.stdregprov.Methods_.Item(method_name).InParameters.SpawnInstance_();
    in_param.hDefKey = hkey;
    in_param.sSubKeyName = key;
    if (value_name != null) {
      in_param.sValueName = value_name;
    }
    var out = this.stdregprov.ExecMethod_(method_name, in_param);
    return out;
  },
 
  EnumKey: function(hkey, key) {
    var out_param = this.do_method("EnumKey", hkey, key);
    var names = [];
    if (out_param.sNames != null) {
      names = out_param.sNames.toArray();
    }
    return names;
  },
 
  GetStringValue: function(hkey, key, name) {
    // REG_SZ
    var out_param = this.do_method("GetStringValue", hkey, key, name);
 
    // 値が存在しない場合null
    return out_param.sValue;
  }
};
 
var reg = new Registry(".");
var exts = Document.Text.split("\n");
 
var regText = "Windows Registry Editor Version 5.00\n\n";
var unregText = regText;
 
// 説明書き
regText +=   '; Mery の関連付けを登録します.\n\n';
unregText += '; Mery の関連付けを解除します.\n\n';
 
// Mery 用の ProgID を登録
var progID = "Mery.Document";
var subKey = progID + "\\shell\\open\\command";
var value = reg.GetStringValue(reg.HKCR, progID, "");
if (value == null) {
  regText +=   '; ProgID を登録\n' +
               '[HKEY_CLASSES_ROOT\\'+ progID +']\n' +
               '[HKEY_CLASSES_ROOT\\'+ progID +'\\shell]\n' +
               '[HKEY_CLASSES_ROOT\\'+ progID +'\\shell\\open]\n' +
               '[HKEY_CLASSES_ROOT\\'+ progID +'\\shell\\open\\command]\n' +
               '@="\\"' + Editor.FullName.replace(/\\/g, '\\\\') + '\\" \\"%1\\""\n\n';
  unregText += '; ProgID を戻す\n' +
               '[-HKEY_CLASSES_ROOT\\'+ progID+']\n\n';
} else {
  // 既に設定済みで異なる場合は退避して登録
  value = reg.GetStringValue(reg.HKCR, subKey, "");
  if (value !== Editor.FullName.replace(/\\/g, '\\\\')) {
    regText +=  '; ProgID を登録\n' +
          '@="\\"' + Editor.FullName.replace(/\\/g, '\\\\') + '\\" \\"%1\\""\n\n';
    unregText +='; ProgID を戻す\n' +
          '[HKEY_CLASSES_ROOT\\' + subKey + ']\n' +
          '@="' + value.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"\n\n';
  }
}
 
// 関連付けの登録
regText +=  '; 関連付けを登録\n';
unregText +='; 関連付けを戻す\n';
for (var i=0; i<exts.length; i++ ){
  if( !exts[i] ){
    continue;
  }
  var ext = "." + exts[i];
 
  // 拡張子の登録
  value = reg.GetStringValue(reg.HKCR, ext, "");
  if (value == null) {
    regText +=   '[HKEY_CLASSES_ROOT\\' + ext + ']\n' +
                 '@="' + progID + '"\n\n';
    unregText += '[-HKEY_CLASSES_ROOT\\' + ext + ']\n\n';
  } else {
    if (value !== progID) {
      regText +=   '[HKEY_CLASSES_ROOT\\' + ext + ']\n' +
                   '@="' + progID + '"\n\n';
      unregText += '[HKEY_CLASSES_ROOT\\' + ext + ']\n' +
                   '@="' + value.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"\n\n';
    }
  }
 
  // 関連付けの登録
  subKey = 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\' + ext;
  value = reg.EnumKey(reg.HKCU, subKey);
  if (value != null) {
    subKey += '\\UserChoice';
    value = reg.GetStringValue(reg.HKCU, subKey, 'Progid');
    if (value != null && value != progID) {
      regText +=  '[-HKEY_CURRENT_USER\\' + subKey + ']\n\n';
      unregText +='[HKEY_CURRENT_USER\\' + subKey + ']\n' +
                  '"Progid"="' + value.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"\n\n';
    }
  }
}
 
// それぞれドキュメント化
Editor.NewFile();
var doc = Editor.Documents.Item(Editor.Documents.Count-1);
doc.Text = regText;
doc.Encoding = meEncodingShiftJIS;
doc.Saved = true;
var regDoc = doc;
 
Editor.NewFile();
doc = Editor.Documents.Item(Editor.Documents.Count-1);
doc.Text = unregText;
doc.Encoding = meEncodingShiftJIS;
doc.Saved = true;
 
regDoc.Activate();

ご意見・ご要望

何かありましたら,右の [編集] から追記してください.対応するもかしれません.