2008-10-10 15 views
8

J'essaie de définir ma variable d'environnement DOS dans Ruby et de la laisser persister après la fermeture du script. Par exemple, si je veux un script Ruby set_abc_env.rb pour définir la variable d'environnement « ABC » à « bla », je me attends à exécuter ce qui suit:Persistance d'une variable d'environnement via Ruby

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

Comment puis-je faire?

Répondre

25

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

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

nouvelles Bad est, comme MSDN says, un processus ne peut pas changer 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 faits.

Bonne nouvelle est ce que Microsoft Windows stocke les variables d'environnement dans le registre et il est possible de propagate variables d'environnement sur le système. Ceci est une façon 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 changements observés aux applications. Voici comment la diffusion peut se faire 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

Pour quelqu'un d'autre à la recherche d'une solution pour cela et la recherche d'un plus d'un hack qui ne nécessite pas la connexion ou à l'extérieur, je suis venu avec cette solution pour un problème similaire:

DEPANNAGE:

Mon travail est d'environ dépend de la combinaison de rubis et une ligne de commande appelé SETENV.EXE develped par Vincent Fatica. Il a plus d'une décennie à ce stade, mais fonctionne très bien sous Windows XP (n'a pas encore testé sous Windows 7). Cela fonctionne mieux que l'utilité de setx disponible de MS IMHO. Au moins pour supprimer des choses. Assurez-vous que setenv est disponible à partir de la ligne de commande. Mettez-le dans des outils c: \ et placez c: \ tools dans votre PATH.

Voici un court exemple d'une méthode 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