これについては過去の質問があります。基本的な要点は、Win32 :: Registryを介してレジストリに変数を設定することです(runakoが言ったように)。次に、WM_SETTINGCHANGEメッセージをブロードキャストして、環境に変更を加えることができます。もちろん、その間にログオフ/ログオンすることもできますが、あまり使い勝手は良くありません。
レジストリコード:
require 'win32/registry.rb'
Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_WRITE) do |reg|
reg['ABC'] = '123'
end
WM_SETTINGCHANGEコード:
require 'Win32API'
SendMessageTimeout = Win32API.new('user32', 'SendMessageTimeout', 'LLLPLLP', 'L')
HWND_BROADCAST = 0xffff
WM_SETTINGCHANGE = 0x001A
SMTO_ABORTIFHUNG = 2
result = 0
SendMessageTimeout.call(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, result)
答えてくれたAlexanderProkofyevに感謝します。
また、マシン全体と現在のユーザーのみ(HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment)で変数を設定する方法など、Windows環境変数全般に関する適切な説明も参照してください。