Se puede acceder a las variables de entorno a través del objeto de Ruby ENV:
i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'
Las malas noticias es, como MSDN says, un proceso que no se puede cambiar directamente las variables de entorno de otro proceso que no es un niño de ese proceso. Entonces cuando el script sale, pierdes todos los cambios que hizo.
Una buena noticia es qué Microsoft Windows almacena variables de entorno en el registro y es posible propagate variables de entorno para el sistema. Esta es una manera de modificar las variables de entorno de usuario:
require 'win32/registry.rb'
Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_WRITE) do |reg|
reg['ABC'] = '123'
end
La documentación también se dice que se debe cerrar la sesión y volver a iniciarla o difundir un mensaje WM_SETTINGCHANGE para hacer cambios observados a las aplicaciones. Esta es la forma de difusión se puede hacer en 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)