Rubyを介した環境変数の永続化
-
06-07-2019 - |
質問
RubyでDOS環境変数を設定しようとしていますが、スクリプトが終了した後もDOS環境変数を保持します。たとえば、ルビースクリプト set_abc_env.rb
で環境変数「ABC」を「blah」に設定する場合、次のコマンドを実行する必要があります。
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 says 、プロセスはそのプロセスの子ではない別のプロセスの環境変数を直接変更することはできません。そのため、スクリプトが終了すると、それまでに行ったすべての変更が失われます。
朗報は、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)
他のヒント
これに対する解決策を探しており、ログインやログアウトを必要としないハックをもっと探している人のために、私は同様の問題についてこの解決策を思いつきました:
回避策:
これを使用したメソッドの簡単な例を次に示します。
def switch_ruby_env
if RUBY_VERSION.match("1.8.7").nil?
`setenv -m CUSTOM_PATH " "`
else
`setenv -m CUSTOM_PATH -delete`
end
end
所属していません StackOverflow