使用Ruby永久(即在注册表中)设置环境变量?

时间:2009-05-26 22:00:13

标签: windows ruby registry environment win32ole

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

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

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

3 个答案:

答案 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程序)可以实现此目的。

相关问题