2009-05-26 121 views
4

在Windows上,我如何使用Ruby來永久設置環境變量?我知道我需要更改註冊表(通過win32ole模塊?),但我是註冊表腳本的新手。使用Ruby永久(即在註冊表中)設置環境變量?

據我所知,我可以說ENV['FOO'] = "c:\bar\baz"爲會話設置環境變量FOO。但是,我有興趣在全局和永久設置環境變量。

我確實找到了patheditor gem,它非常適合永久性更改Windows PATH。但是我想設置其他環境變量,例如,JAVA_HOME

回答

8

這裏有一個past question。基本要點是通過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) 

感謝亞歷山大·普羅科法爾維爲the answer

也可參閱Windows環境變量a good discussion一般,包括如何設置他們爲整個機器與不僅僅是當前用戶(在HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \控制\會話管理\環境)

+0

我能夠讀取但不寫或創建密鑰,即使在HKEY_CURRENT_USER,我得到的訪問被拒絕。 [附加的pastebin](http://pastebin.com/TSEKeqyb)顯示錯誤,因爲它們有點長。儘管我能讀懂鑰匙。有沒有解決權限錯誤,或使用提升的權限,然後退後一步? – Pred 2013-11-06 15:16:16

1

您正在尋找的Win32 ::註冊地:

http://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/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

我高興地看到如此全面的答案!

還應該注意的是,當使用諸如Win32 :: Registry :: KEY_WRITE之類的常量標誌創建/寫入保留/系統密鑰(例如64位Windows操作系統上的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node)除非MRI(Ruby解釋器)實例從「管理員」內核上下文啓動,否則Win32 :: Registry :: KEY_ALL_ACCESS將不會顯示所需的行爲。通過右鍵單擊可執行文件並選擇「以管理員身份運行」啓動cmd.exe(Windows shell程序)可以實現此目的。