Вы можете получить доступ к переменным среды через объект Ruby ENV:
i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'
Плохая новость, как говорит MSDN , - процесс не может напрямую изменять переменные среды другого процесса, который не является дочерним для этого процесса. Поэтому, когда скрипт завершается, вы теряете все изменения, которые он сделал.
Хорошая новость заключается в том, что Microsoft Windows хранит переменные среды в реестре, и можно распространять переменные среды в системе. Это способ изменения переменных среды пользователя:
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)