Pergunta

Estou tentando definir a minha variável de ambiente DOS em Ruby, e tê-lo persistir após as saídas de script. Por exemplo, se eu quero um set_abc_env.rb ruby ??script para conjunto variável de ambiente 'ABC' para 'blá', eu espero para executar o seguinte:

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

Como posso fazer isso?

Foi útil?

Solução

Você pode acessar variáveis ??de ambiente através de rubi ENV objeto:

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

A má notícia é, como MSDN diz , um processo que nunca pode alterar diretamente as variáveis ??de ambiente de outro processo que não é uma criança desse processo. Portanto, quando sai do script, você perde todas as alterações que fez.

A boa notícia é que a Microsoft Windows armazena as variáveis ??de ambiente no registro e é possível propagar ambiente variáveis ??para o sistema. Esta é uma maneira de modificar as variáveis ??de ambiente de usuário:

require 'win32/registry.rb'

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

A documentação também diz que você deve fazer logoff e logon novamente ou transmitir uma mensagem WM_SETTINGCHANGE para fazer mudanças visto para os aplicativos. Isto é como a transmissão pode ser feito em 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)  

Outras dicas

Para qualquer pessoa que esteja procurando uma solução para isso e procurando por um mais de um hack que não requer registro de dentro ou fora eu vim com esta solução para um problema semelhante:

Solução:

O meu trabalho em torno depende de combinação de rubi e um utilitário de linha de comando chamado SETENV.EXE develped por Vincent Fatica. É mais do que uma década de idade neste momento, mas funciona bem no Windows XP (não o fez teste no Windows 7 até o momento). Ele funciona melhor do que utilidade setx disponível a partir MS IMHO. Ao menos para coisas exclusão. Certifique-se de setenv está disponível a partir da linha de comando. Coloque-o em algum c: \ ferramentas e put C:. \ Ferramentas em seu PATH

Aqui está um pequeno exemplo de um método de usá-lo:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top