Pregunta

Estoy tratando de configurar mi variable de entorno DOS en Ruby y hacer que persista después de que el script se cierre. Por ejemplo, si quiero un script de ruby ?? set_abc_env.rb para establecer la variable de entorno 'ABC' en 'blah', espero ejecutar lo siguiente:

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

¿Cómo hago esto?

¿Fue útil?

Solución

Puede acceder a las variables de entorno a través del objeto Ruby ENV:

i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'

Malas noticias son, como MSDN dice , un proceso nunca puede cambiar directamente las variables de entorno de otro proceso que no es hijo de ese proceso. Entonces, cuando el script finaliza, pierde todos los cambios que hizo.

Buenas noticias es lo que Microsoft Windows almacena las variables de entorno en el registro y es posible propagar entorno variables al sistema. Esta es una forma de modificar las variables de entorno del 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 dice que debe cerrar sesión y volver a iniciar sesión o transmitir un mensaje WM_SETTINGCHANGE para realizar cambios en las aplicaciones. Así es como se puede hacer la transmisión 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)  

Otros consejos

Para cualquiera que busque una solución para esto y busque un truco que no requiera iniciar o cerrar sesión, se me ocurrió esta solución para un problema similar:

TRABAJO :

Mi solución depende de la combinación de ruby ??y una utilidad de línea de comandos llamada SETENV.EXE desarrollado por Vincent Fatica. Tiene más de una década 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 IMHO. Al menos para borrar cosas. Asegúrese de que setenv esté disponible desde la línea de comandos. Ponlo en algunas herramientas c: \ y pon herramientas c: \ en tu RUTA.

Aquí hay un breve ejemplo de un método que lo usa:

def switch_ruby_env
  if RUBY_VERSION.match("1.8.7").nil?  
    `setenv -m CUSTOM_PATH " "`
  else
    `setenv -m CUSTOM_PATH -delete`
  end
end 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top