Вопрос

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

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

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

Это было полезно?

Решение

Вы можете получить доступ к переменным среды через объект 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)  

Другие советы

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

РЕШЕНИЕ:

Моя работа зависит от комбинации Ruby и утилиты командной строки под названием SETENV.EXE разработан Винсентом Фатикой.На данный момент ему уже более десяти лет, но он отлично работает в Windows XP (под Windows 7 еще не тестировался).Она работает лучше, чем утилита setx, доступная от MS IMHO.Хотя бы для удаления чего-либо.Убедитесь, что setenv доступен из командной строки.Поместите его в c: ools и поместите c: ools в свой 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 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top