我想在Ruby中设置我的DOS环境变量,并在脚本退出后让它保留。例如,如果我想要一个Ruby脚本set_abc_env.rb
设置环境变量“ABC”到“嗒嗒”,我希望运行以下命令:通过Ruby持久化环境变量
C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah
我该怎么办呢?
我想在Ruby中设置我的DOS环境变量,并在脚本退出后让它保留。例如,如果我想要一个Ruby脚本set_abc_env.rb
设置环境变量“ABC”到“嗒嗒”,我希望运行以下命令:通过Ruby持久化环境变量
C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah
我该怎么办呢?
您可以通过红宝石ENV对象访问环境变量:
i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'
坏消息是,作为MSDN says,这个过程不能直接改变另一个进程,是不是该进程的一个孩子的环境变量。所以当脚本退出时,你会失去它所做的所有更改。
好消息是Microsoft Windows在注册表中存储了环境变量,并且有可能将propagate环境变量提供给系统。这是修改用户环境变量的方式:
require 'win32/registry.rb'
Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_WRITE) do |reg|
reg['ABC'] = '123'
end
文档也说,你应该注销并重新登录或广播WM_SETTINGCHANGE消息,使看到的应用程序的变化。这就是广播可以在Ruby中进行:
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)
为别人寻找一个解决方案,并寻找一个更不需要在登录或黑客攻击的出来,我想出了这个解决方案类似的问题:
解决方法:
我的解决办法是依赖于红宝石的组合和一个名为SETENV.EXE命令行实用程序由文森特Fatica develped。现在已经超过十年了,但在Windows XP中运行良好(尚未在Windows 7下测试)。它比MS IMHO提供的setx工具更好。以免删除东西。确保setenv可从命令行获得。把它放在一些c:\ tools中,并把c:\ tools放到PATH中。
下面是使用它的方法的简短的例子:
def switch_ruby_env
if RUBY_VERSION.match("1.8.7").nil?
`setenv -m CUSTOM_PATH " "`
else
`setenv -m CUSTOM_PATH -delete`
end
end