在Windows上,我如何使用Ruby永久设置一个环境variables? 我知道我需要改变registry(通过win32ole模块?),但我是一个新手脚本registry。
我知道我可以说ENV['FOO'] = "c:\bar\baz"
来为会话设置环境variablesFOO
。 但是,我有兴趣设置全局和永久的环境variables。
我find了patheditor gem,它对于永久改变Windows PATH
非常有用。 但是我想设置其他环境variables,例如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)
感谢亚历山大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)除非MRI(Ruby解释器)实例从“管理员”内核上下文启动,否则:: KEY_ALL_ACCESS将不会显示所需的行为。 通过右键单击可执行文件并选择“以管理员身份运行”启动cmd.exe(Windows shell程序)可以实现这一点。