環境変数のPATHの編集をどうにかしたい
Windowsで環境変数のパスを変えるとき、普通こんなダイアログを使って編集します。
値にはディレクトリのパスを入れるので、結構長くなるのですが、それをセミコロン区切りで1行で入力しなければなりません。
明らかにエディットボックスが小さい!!追加をしていく分にはまだマシですが、途中の値を編集したり削除しようとすると、思ったところにスクロールできずイライラします。
環境変数のPATH自体はレジストリに書かれているので、それを読み取ってエディタで編集するスクリプトを作りました。
require 'win32/registry' require 'tempfile' regs = { # システム環境変数 'System' => [Win32::Registry::HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'], # ユーザ環境変数 'User' => [Win32::Registry::HKEY_CURRENT_USER, 'Environment'] } changed = false Tempfile.open("環境変数の編集_") do |temp| before = {} # レジストリからの読み取ったキーと値をファイルへ書き込む regs.each do |keyname, keys| key, subkey = keys temp.puts "[#{keyname}]" Win32::Registry.open(key, subkey) do |reg| before[keyname] = reg['PATH'].split(/;+/) temp.puts before[keyname].join("\n") end end # 一度ファイルを閉じ、エディタで開く temp.close `notepad #{temp.path}` txt = temp.open.read txt.split(/(\[.*\]\n+)/).drop(1).each_slice(2) do |ret| keyname = $1 if ret[0] =~ /\[(.*)\]/ after = ret[1].split(/\n+/) # 変更があった場合、レジストリに書き込む if keyname and before[keyname] and before[keyname] != after key, subkey = regs[keyname] Win32::Registry.create(key, subkey) do |reg| reg['PATH'] = after.join(';') end changed = true end end end # 環境変数が変更されたことを通知する if changed require 'dl/win32' send_msg = Win32API.new('user32.dll', 'SendMessage', 'LILS', 'L') send_msg.call( 0xffff, 0x001A, 0, 'Environment' ) end
入力後にtxtをパースする部分が、だいぶ強引になってしまった…
使い勝手はまあまあでしょう。