在 Windows 上,如何使用 Ruby 永久设置环境变量?我知道我需要更改注册表(通过 win32ole 模块?),但在编写注册表脚本方面我是新手。
我知道我可以说为会话ENV['FOO'] = "c:\bar\baz"
设置环境变量FOO
。但是,我对全局和永久设置环境变量感兴趣。
我确实找到了 patheditor gem,它非常适合永久更改 Windows PATH
。但我想设置其他环境变量,例如JAVA_HOME
.
在 Windows 上,如何使用 Ruby 永久设置环境变量?我知道我需要更改注册表(通过 win32ole 模块?),但在编写注册表脚本方面我是新手。
我知道我可以说为会话ENV['FOO'] = "c:\bar\baz"
设置环境变量FOO
。但是,我对全局和永久设置环境变量感兴趣。
我确实找到了 patheditor gem,它非常适合永久更改 Windows PATH
。但我想设置其他环境变量,例如JAVA_HOME
.
过去有一个关于此的问题。基本要点是通过 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 中)
您正在寻找 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
如果密钥尚不存在,您可能必须先创建密钥。
很高兴看到这么全面的答案!
还应注意,在使用 Win32::Registry::KEY_WRITE 和 Win32::Registry 等常量标志创建/写入保留/系统键下的条目时(例如 64 位 Windows 操作系统上的 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node) ::KEY_ALL_ACCESS 不会表现出期望的行为,除非 MRI(Ruby 解释器)实例是从“管理员”内核上下文启动的。通过右键单击可执行文件并选择“以管理员身份运行”来启动 cmd.exe(Windows shell 程序)允许这样做。