gpt4 book ai didi

windows - 通过 Ruby 持久化环境变量

转载 作者:可可西里 更新时间:2023-11-01 12:44:31 25 4
gpt4 key购买 nike

我试图在 Ruby 中设置我的 DOS 环境变量,并让它在脚本退出后保持不变。例如,如果我想要一个 ruby​​ 脚本 set_abc_env.rb 将环境变量“ABC”设置为“blah”,我希望运行以下命令:

C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah

我该怎么做?

最佳答案

您可以通过 Ruby 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)

关于windows - 通过 Ruby 持久化环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com