それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

WindowsのPATHを設定するJScript

Windowsにプログラム突っ込むとパスを通すのが面倒なのです。

linux なら .bashrc に書けるじゃん。

Windowsは次の理由で面倒だった。


Windowsでパス( PATH )を通すには、次の方法があります。

  • Windows提供のプログラムを使う(マイコンピュータから)
  • レジストリから変更する


両方ともUACが必要ですし、レジストリ変えたら、ログオフだし。マイコンピュータから変更すると、編集が面倒だし。
なにより、どこにナニを書いたのかコメントが残せない。なぜこのPATHを通したか。記録が残らない。不便すぎる。

スクリプトで管理する方法を考えた

専用のアプリ使っても良いんですが、「履歴が残らない」「コメント残せない」ので、ちょっともどかしい。
しかたないので、PATHを変更するJScriptを書いておいた。

レジストリを操作してPATHを書き換える.js

//TakuyaのカスタムPATH
var my_path_list =[
  'C:\\Users\\takuya\\apps\\nmap-5.21',
  'C:\\Users\\takuya\\apps\\win-bash',
  'C:\\Users\\takuya\\apps\\vim\\vim73',
  'C:\\Users\\takuya\\ruby\\bin',
  'C:\\Python26',
  'C:\\Program Files\\mingw\\bin',
  'C:\\Program Files\\Mercurial',
  'C:\\Users\\takuya\\apps\\gnuwin32\\bin',
  'C:\\Users\\takuya\\apps\\tidy',
  'C:\\Users\\takuya\\php',
];
//ユニーク
Array.prototype.uniq = function(){
  tmp = {};tmp_arr = [];
  for( var i=0;i<this.length;i++){tmp[this[i]] = i;}
  for( i in tmp){tmp_arr.push(i);}
  return tmp_arr;
}
//ゴミは掃除
Array.prototype.trim_empty = function(){
  a=[];
  for( var i=0;i<this.length;i++){
    if(this[i]==""){continue}
    if(!this[i]){continue}
    a.push(this[i]);
  }
  return a;
}

//既存のパスを読み込んで展開する。
function path_dirs(){
  var shell =new ActiveXObject("WScript.Shell");
  var key   = "HKEY_CURRENT_USER\\Environment\\PATH";
  var value = shell.RegRead(key);
  path_list = value.split(";");
  array=[]
  for( var i=0;i<path_list.length;i++){
    if(path_list[i]==""){continue}
    array.push(path_list[i]);
  }
  return array;
}

function set_path( path_list ){
  var shell =new ActiveXObject("WScript.Shell");
  var key   = "HKEY_CURRENT_USER\\Environment\\PATH";
  shell.RegWrite( key, path_list.join(";") , "REG_EXPAND_SZ")
}

paths= path_dirs().concat(my_path_list).trim_empty().uniq();
set_path(paths);
/**
* WMI をWSHから起動して引数に一致するなまえのプロセスを殺す。
* @argment program_name プログラム名(たいていは ***.exe)
*/
function TerminateProcess( program_name ){
  var strComputer = ".";
  var name = "winmgmts:\\\\" + strComputer + "\\root\\CIMV2";
  var oWmis = GetObject(name);
  var cols = oWmis.ExecQuery("SELECT * FROM Win32_Process WHERE Caption = '"+ program_name +"'")
  var list = new Enumerator(cols)
  for(;!list.atEnd(); list.moveNext()){
    var proc = list.item();
    proc.terminate()
  }
}
TerminateProcess("explorer.exe");


これで、自分がナニを何時入れたのか分かるようになりました。git / mercurial で履歴取れるので楽になりました。

昔々の人達ははautoexec.bat 使ってたのかな?

テキストファイルは偉大です。

達人プログラマに書いて有るとおり、テキストファイルは偉大です。