質問

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)  
scroll top