我想在Ruby中設置我的DOS環境變量,並在腳本退出後讓它保留。例如,如果我想要一個Ruby腳本set_abc_env.rb
設置環境變量「ABC」到「嗒嗒」,我希望運行以下命令:通過Ruby持久化環境變量
C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah
我該怎麼辦呢?
我想在Ruby中設置我的DOS環境變量,並在腳本退出後讓它保留。例如,如果我想要一個Ruby腳本set_abc_env.rb
設置環境變量「ABC」到「嗒嗒」,我希望運行以下命令:通過Ruby持久化環境變量
C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah
我該怎麼辦呢?
您可以通過紅寶石ENV對象訪問環境變量:
i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'
壞消息是,作爲MSDN says,這個過程不能直接改變另一個進程,是不是該進程的一個孩子的環境變量。所以當腳本退出時,你會失去它所做的所有更改。
好消息是Microsoft Windows在註冊表中存儲了環境變量,並且有可能將propagate環境變量提供給系統。這是修改用戶環境變量的方式:
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)
爲別人尋找一個解決方案,並尋找一個更不需要在登錄或黑客攻擊的出來,我想出了這個解決方案類似的問題:
解決方法:
我的解決辦法是依賴於紅寶石的組合和一個名爲SETENV.EXE命令行實用程序由文森特Fatica develped。現在已經超過十年了,但在Windows XP中運行良好(尚未在Windows 7下測試)。它比MS IMHO提供的setx工具更好。以免刪除東西。確保setenv可從命令行獲得。把它放在一些c:\ tools中,並把c:\ tools放到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