4

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

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

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

4

3 回答 3

8

过去有一个关于此的问题。基本要点是通过 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的回答

另请参阅有关 Windows 环境变量的一般讨论,包括如何为整个机器设置它们而不是仅当前用户(在 HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Control\ Session Manager\ Environment 中)

于 2009-05-28T03:19:14.283 回答
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

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

于 2009-05-26T22:05:20.187 回答
0

很高兴看到这么全面的答案!

还应注意,在使用 Win32::Registry::KEY_WRITE 和 Win32::Registry 等常量标志创建/写入保留/系统键下的条目时(例如 64 位 Windows 操作系统上的 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node) ::KEY_ALL_ACCESS 不会表现出期望的行为,除非 MRI(Ruby 解释器)实例是从“管理员”内核上下文启动的。通过右键单击可执行文件并选择“以管理员身份运行”来启动 cmd.exe(Windows shell 程序)允许这样做。

于 2016-09-21T14:06:49.540 回答