2008-10-10 20 views
8

Estoy intentando establecer mi variable de entorno de DOS en Ruby, y que persista después de que la secuencia de comandos haya finalizado. Por ejemplo, si quiero un script ruby ​​set_abc_env.rb para establecer la variable de entorno 'ABC' a 'bla', espero que ejecutar el siguiente:Persistencia de una variable de entorno a través de Ruby

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

¿Cómo se hace esto?

Respuesta

25

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) 
1

Para cualquier otra persona en busca de una solución para esto y en busca de una forma más de un truco que no requiere registro dentro o fuera me ocurrió con esta solución para un problema similar:

Solución:

Mi trabajo alrededor depende de la combinación de rubí y una utilidad de línea de comandos llamada SETENV.EXE develped por Vincent fatica. Tiene más de una década de antigüedad en este momento, pero funciona bien en Windows XP (aún no se ha probado en Windows 7). Funciona mejor que la utilidad setx disponible de MS en mi humilde opinión. Por lo menos para eliminar cosas. Asegúrate de que setenv esté disponible desde la línea de comando. Póngalo en algunas herramientas c: \ y ponga c: \ tools en su RUTA.

Aquí está un breve ejemplo de un método de usarlo:

def switch_ruby_env 
    if RUBY_VERSION.match("1.8.7").nil? 
    `setenv -m CUSTOM_PATH " "` 
    else 
    `setenv -m CUSTOM_PATH -delete` 
    end 
end 
Cuestiones relacionadas