在Windows上,如何使用Ruby永久设置环境变量?我知道我需要更改注册表(通过win32ole模块?)但我是一个关于脚本注册表的新手。
我知道我可以说ENV['FOO'] = "c:\bar\baz"
为会话设置环境变量FOO
。但是,我更感兴趣的是全局和永久地设置环境变量。
我找到了patheditor gem,它非常适合永久改变Windows PATH
。但我想设置其他环境变量,例如JAVA_HOME
。
答案 0 :(得分:8)
有一个past question。基本要点是通过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)
感谢Alexander Prokofyev the answer。
另请参阅有关Windows环境变量的a good discussion,包括如何为整个计算机设置它们而不仅仅是当前用户(在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment中)
答案 1 :(得分:1)
您正在寻找Win32 :: Registry:
http://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Registry.html
供参考,以下是我如何找到它:
http://www.google.com/search?client=safari&rls=en-us&q=ruby+registry&ie=UTF-8&oe=UTF-8
无论如何,那么你会想做类似的事情:
registry.open("HKEY_WINDOWS_GUNK/path/to/your/key", Win32::Registry::KEY_WRITE) do |reg|
reg[regentry, Win32::Registry::REG_DWORD]=value
end
如果密钥尚不存在,则可能必须先创建密钥。
答案 2 :(得分:0)
我很高兴看到这么全面的答案!
还应注意,在使用常量标志(如Win32 :: Registry :: KEY_WRITE和Win32)创建/写入保留/系统密钥(例如64位Windows操作系统上的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node)下的条目时::除非MRI(Ruby解释器)实例是从“管理员”内核上下文启动的,否则Registry :: KEY_ALL_ACCESS将不会显示所需的行为。通过右键单击可执行文件并选择“以管理员身份运行”来启动cmd.exe(Windows shell程序)可以实现此目的。