通过 Ruby 持久化环境变量 [英] Persisting an environment variable through Ruby
问题描述
我正在尝试在 Ruby 中设置我的 DOS 环境变量,并在脚本退出后让它保持不变.例如,如果我想要一个 ruby 脚本 set_abc_env.rb
将环境变量 'ABC' 设置为 'blah',我希望运行以下命令:
I am trying to set my DOS environment variable in Ruby, and have it persist after the script exits. For example, if I want a ruby script set_abc_env.rb
to set environment variable 'ABC' to 'blah', I expect to run the following:
C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah
我该怎么做?
推荐答案
可以通过 Ruby ENV 对象访问环境变量:
You can access environment variables via Ruby ENV object:
i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'
坏消息是,正如 MSDN 所说,一个进程永远不能直接更改不是该进程的子进程的另一个进程的环境变量.因此,当脚本退出时,您会丢失它所做的所有更改.
Bad news is, as MSDN says, a process can never directly change the environment variables of another process that is not a child of that process. So when script exits, you lose all changes it did.
好消息是 Microsoft Windows 将环境变量存储在注册表中,并且可以传播环境系统变量.这是一种修改用户环境变量的方法:
Good news is what Microsoft Windows stores environment variables in the registry and it's possible to propagate environment variables to the system. This is a way to modify user environment variables:
require 'win32/registry.rb'
Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_WRITE) do |reg|
reg['ABC'] = '123'
end
文档还说您应该注销并重新登录或广播 WM_SETTINGCHANGE 消息以使应用程序看到更改.这就是在 Ruby 中进行广播的方式:
The documentation also says you should log off and log back on or broadcast a WM_SETTINGCHANGE message to make changes seen to applications. This is how broadcasting can be done in 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)
这篇关于通过 Ruby 持久化环境变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!