Domanda

Sto provando a impostare la mia variabile di ambiente DOS in Ruby e farla persistere dopo la chiusura dello script. Ad esempio, se voglio uno script ruby ?? set_abc_env.rb per impostare la variabile di ambiente 'ABC' su 'blah', mi aspetto di eseguire quanto segue:

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

Come posso farlo?

È stato utile?

Soluzione

È possibile accedere alle variabili di ambiente tramite l'oggetto Ruby ENV:

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

Le cattive notizie sono, come MSDN dice , un processo non può mai modificare direttamente le variabili di ambiente di un altro processo che non è figlio di quel processo. Quindi quando esce lo script, perdi tutte le modifiche apportate.

Una buona notizia è ciò che Microsoft Windows archivia le variabili di ambiente nel registro ed è possibile propagare variabili al sistema. Questo è un modo per modificare le variabili di ambiente dell'utente:

require 'win32/registry.rb'

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

La documentazione indica inoltre che è necessario disconnettersi e riconnettersi o trasmettere un messaggio WM_SETTINGCHANGE per apportare modifiche alle applicazioni. Ecco come si può fare la trasmissione in 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)  

Altri suggerimenti

Per chiunque sia alla ricerca di una soluzione per questo e alla ricerca di un hack più che non richiede l'accesso o la disconnessione, ho trovato questa soluzione per un problema simile:

SOLUZIONE:

Il mio lavoro dipende dalla combinazione di ruby ??e un'utilità della riga di comando chiamata SETENV.EXE sviluppato da Vincent Fatica. A questo punto ha più di un decennio, ma funziona bene in Windows XP (non ancora testato con Windows 7). Funziona meglio dell'utilità setx disponibile da MS IMHO. Per non cancellare le cose. Assicurarsi che setenv sia disponibile dalla riga di comando. Inseriscilo in alcuni strumenti c: \ e inserisci c: \ tools nel tuo PERCORSO.

Ecco un breve esempio di un metodo che lo utilizza:

def switch_ruby_env
  if RUBY_VERSION.match("1.8.7").nil?  
    `setenv -m CUSTOM_PATH " "`
  else
    `setenv -m CUSTOM_PATH -delete`
  end
end 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top