Использовать Ruby для постоянной (т.е. в реестре) установки переменных среды - PullRequest
4 голосов
/ 27 мая 2009

В Windows, как я могу использовать Ruby для постоянной установки переменной среды? Я знаю, что мне нужно изменить реестр (через модуль win32ole?), Но я новичок в создании сценариев реестра.

Я понимаю, что могу сказать ENV['FOO'] = "c:\bar\baz", чтобы установить переменную окружения FOO для сеанса. Однако вместо этого меня интересует глобальная и постоянная установка переменных среды.

Я нашел драгоценный камень patheditor, который отлично работает для постоянного изменения Windows PATH. Но я хочу установить другие переменные окружения, например, JAVA_HOME.

Ответы [ 3 ]

8 голосов
/ 28 мая 2009

Прошёл прошлый вопрос по этому поводу. Основная идея состоит в том, чтобы установить переменную в реестре через Win32 :: Registry (как сказал runako). Затем вы можете передать сообщение WM_SETTINGCHANGE, чтобы внести изменения в среду. Конечно, вы могли бы также выйти из системы, но не очень удобно.

Регистрационный код:

require 'win32/registry.rb'

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

WM_SETTINGCHANGE код:

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)

Спасибо Александру Прокофьеву за ответ .

Также см. хорошее обсуждение в целом о переменных среды Windows, в том числе о том, как установить их для всего компьютера вместо всего текущего пользователя (в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment )

1 голос
/ 27 мая 2009

Вы ищете Win32 :: Реестр:

http://www.ruby -doc.org / STDLIB / libdoc / Win32API / RDoc / классы / Win32 / Registry.html

Для справки вот как я его нашел:

http://www.google.com/search?client=safari&rls=en-us&q=ruby+registry&ie=UTF-8&oe=UTF-8

Во всяком случае, тогда вы захотите сделать что-то вроде:

registry.open("HKEY_WINDOWS_GUNK/path/to/your/key", Win32::Registry::KEY_WRITE) do |reg|
   reg[regentry, Win32::Registry::REG_DWORD]=value
end

Возможно, вам придется сначала создать ключ, если он еще не существует.

0 голосов
/ 21 сентября 2016

Я рад видеть такой исчерпывающий набор ответов!

Следует также отметить, что при создании / записи в записи под зарезервированными / системными ключами (такими как HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node в 64-битной операционной системе Windows) используются постоянные флаги, такие как Win32 :: Registry :: KEY_WRITE и Win32 :: Registry :: KEY_ALL_ACCESS не будет демонстрировать желаемого поведения, если экземпляр MRI (интерпретатор Ruby) не запущен из контекста ядра «Администратор». Запуск cmd.exe (программа оболочки Windows), щелкнув правой кнопкой мыши исполняемый файл и выбрав «Запуск от имени администратора», позволяет это.

...