2009-05-26 82 views
4

在Windows上,我如何使用Ruby来永久设置环境变量?我知道我需要更改注册表(通过win32ole模块?),但我是注册表脚本的新手。使用Ruby永久(即在注册表中)设置环境变量?

据我所知,我可以说ENV['FOO'] = "c:\bar\baz"为会话设置环境变量FOO。但是,我有兴趣在全局和永久设置环境变量。

我确实找到了patheditor gem,它非常适合永久性更改Windows PATH。但是我想设置其他环境变量,例如,JAVA_HOME

回答

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) 

感谢亚历山大·普罗科法尔维为the answer

也可参阅Windows环境变量a good discussion一般,包括如何设置他们为整个机器与不仅仅是当前用户(在HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\会话管理\环境)

+0

我能够读取但不写或创建密钥,即使在HKEY_CURRENT_USER,我得到的访问被拒绝。 [附加的pastebin](http://pastebin.com/TSEKeqyb)显示错误,因为它们有点长。尽管我能读懂钥匙。有没有解决权限错误,或使用提升的权限,然后退后一步? – Pred 2013-11-06 15:16:16

1

您正在寻找的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 

如果尚不存在,您可能必须先创建一个密钥。

0

我高兴地看到如此全面的答案!

还应该注意的是,当使用诸如Win32 :: Registry :: KEY_WRITE之类的常量标志创建/写入保留/系统密钥(例如64位Windows操作系统上的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node)除非MRI(Ruby解释器)实例从“管理员”内核上下文启动,否则Win32 :: Registry :: KEY_ALL_ACCESS将不会显示所需的行为。通过右键单击可执行文件并选择“以管理员身份运行”启动cmd.exe(Windows shell程序)可以实现此目的。