Сохранение переменной среды через Ruby - PullRequest
8 голосов
/ 10 октября 2008

Я пытаюсь установить переменную окружения DOS в Ruby и сохранить ее после выхода из сценария. Например, если я хочу, чтобы скрипт ruby ​​set_abc_env.rb установил переменную среды 'ABC' в 'blah', я ожидаю запустить следующее:

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

Как мне это сделать?

Ответы [ 2 ]

25 голосов
/ 10 октября 2008

Вы можете получить доступ к переменным среды через объект Ruby ENV:

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

Плохая новость, как говорит MSDN , - процесс не может напрямую изменять переменные среды другого процесса, который не является дочерним для этого процесса. Поэтому, когда скрипт завершается, вы теряете все изменения, которые он сделал.

Хорошая новость заключается в том, что Microsoft Windows хранит переменные среды в реестре, и можно распространять переменные среды в системе. Это способ изменения переменных среды пользователя:

require 'win32/registry.rb'

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

В документации также говорится, что вы должны выйти и снова войти в систему или передать сообщение WM_SETTINGCHANGE, чтобы внести изменения в приложения. Вот как вещание может быть сделано в 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 голос
/ 31 марта 2011

Для тех, кто ищет решение для этого и ищет взломать, который не требует входа или выхода, я пришел к этому решению для аналогичной проблемы:

Временное решение:

Моя работа зависит от сочетания ruby ​​и утилиты командной строки SETENV.EXE , разработанной Винсентом Фатикой. Ему уже более десяти лет, но он отлично работает в Windows XP (пока не тестировал под Windows 7). Работает лучше, чем утилита setx от MS IMHO. По крайней мере, для удаления материала. Убедитесь, что setenv доступен из командной строки. Поместите его в некоторые инструменты c: \ и поместите инструменты c: \ в путь PATH.

Вот краткий пример использования метода:

def switch_ruby_env
  if RUBY_VERSION.match("1.8.7").nil?  
    `setenv -m CUSTOM_PATH " "`
  else
    `setenv -m CUSTOM_PATH -delete`
  end
end 
...