Question

J'essaie de définir ma variable d'environnement DOS dans Ruby et de la conserver après la sortie du script. Par exemple, si je souhaite qu'un script ruby ?? set_abc_env.rb définisse la variable d'environnement "ABC" sur "blah", je m'attends à exécuter ce qui suit:

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

Comment puis-je faire cela?

Était-ce utile?

La solution

Vous pouvez accéder aux variables d'environnement via l'objet Ruby ENV:

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

Mauvaise nouvelle, comme le dit MSDN, dit , un processus ne peut jamais modifier directement les variables d’environnement d’un autre processus qui n’est pas un enfant de ce processus. Ainsi, lorsque le script se termine, vous perdez tous les changements qu'il a effectués.

La bonne nouvelle est que Microsoft Windows stocke les variables d'environnement dans le registre et il est possible de propager de l'environnement variables au système. C’est un moyen de modifier les variables d’environnement utilisateur:

require 'win32/registry.rb'

Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_WRITE) do |reg|
  reg['ABC'] = '123'
end

La documentation indique également que vous devez vous déconnecter et vous reconnecter ou diffuser un message WM_SETTINGCHANGE pour apporter des modifications aux applications. Voici comment diffuser 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)  

Autres conseils

Pour tous ceux qui recherchent une solution à ce problème et recherchent un système plus sophistiqué qui ne nécessite pas de connexion ou de déconnexion, je propose cette solution pour un problème similaire:

Contournement:

Mon travail dépend de la combinaison de ruby ??et d'un utilitaire de ligne de commande appelé SETENV.EXE développé par Vincent Fatica. Il a plus de dix ans à ce stade, mais fonctionne parfaitement sous Windows XP (n’a pas encore été testé sous Windows 7). Cela fonctionne mieux que l'utilitaire setx disponible à partir de MS IMHO. Au moins pour supprimer des choses. Assurez-vous que setenv est disponible en ligne de commande. Mettez-le dans certains outils c: \ et insérez c: \ tools dans votre PATH.

Voici un court exemple d'une méthode l'utilisant:

def switch_ruby_env
  if RUBY_VERSION.match("1.8.7").nil?  
    `setenv -m CUSTOM_PATH " "`
  else
    `setenv -m CUSTOM_PATH -delete`
  end
end 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top