Persistindo uma variável ambiente através de rubi
-
06-07-2019 - |
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?
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