通过Ruby持久化环境变量 [英] Persisting an environment variable through Ruby

查看:270
本文介绍了通过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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆