在Windows上,我如何使用Ruby来永久设置环境变量?我知道我需要更改注册表(通过win32ole模块?),但我是注册表脚本的新手。使用Ruby永久(即在注册表中)设置环境变量?
据我所知,我可以说ENV['FOO'] = "c:\bar\baz"
为会话设置环境变量FOO
。但是,我有兴趣在全局和永久设置环境变量。
我确实找到了patheditor gem,它非常适合永久性更改Windows PATH
。但是我想设置其他环境变量,例如,JAVA_HOME
。
在Windows上,我如何使用Ruby来永久设置环境变量?我知道我需要更改注册表(通过win32ole模块?),但我是注册表脚本的新手。使用Ruby永久(即在注册表中)设置环境变量?
据我所知,我可以说ENV['FOO'] = "c:\bar\baz"
为会话设置环境变量FOO
。但是,我有兴趣在全局和永久设置环境变量。
我确实找到了patheditor gem,它非常适合永久性更改Windows PATH
。但是我想设置其他环境变量,例如,JAVA_HOME
。
这里有一个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)
感谢亚历山大·普罗科法尔维为the answer。
也可参阅Windows环境变量a good discussion一般,包括如何设置他们为整个机器与不仅仅是当前用户(在HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\会话管理\环境)
您正在寻找的Win32 ::注册地:
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
如果尚不存在,您可能必须先创建一个密钥。
我高兴地看到如此全面的答案!
还应该注意的是,当使用诸如Win32 :: Registry :: KEY_WRITE之类的常量标志创建/写入保留/系统密钥(例如64位Windows操作系统上的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node)除非MRI(Ruby解释器)实例从“管理员”内核上下文启动,否则Win32 :: Registry :: KEY_ALL_ACCESS将不会显示所需的行为。通过右键单击可执行文件并选择“以管理员身份运行”启动cmd.exe(Windows shell程序)可以实现此目的。
我能够读取但不写或创建密钥,即使在HKEY_CURRENT_USER,我得到的访问被拒绝。 [附加的pastebin](http://pastebin.com/TSEKeqyb)显示错误,因为它们有点长。尽管我能读懂钥匙。有没有解决权限错误,或使用提升的权限,然后退后一步? – Pred 2013-11-06 15:16:16