2008-10-10 18 views
8

के माध्यम से एक वातावरण चर बने मैं रूबी में मेरी डॉस वातावरण चर सेट करने के लिए कोशिश कर रहा हूँ, और यह जारी रहती है स्क्रिप्ट बाहर निकालता है के बाद की है।रूबी

C:> echo %ABC% 
C:> set_abc_env.rb 
C:> echo %ABC% blah 

मैं यह करने के लिए कैसे करते हैं: उदाहरण के लिए, अगर मैं चाहता हूँ एक गहरे लाल रंग का स्क्रिप्ट set_abc_env.rb वातावरण चर 'blah' को 'एबीसी' स्थापित करने के लिए, मैं निम्नलिखित चलाने के लिए उम्मीद करते हैं?

उत्तर

25

आप रूबी ENV वस्तु के माध्यम से वातावरण चर का उपयोग कर सकते हैं:

i = ENV['ABC']; # nil 
ENV['ABC'] = '123'; 
i = ENV['ABC']; # '123' 

बुरी खबर है, MSDN says के रूप में, एक प्रक्रिया सीधे किसी अन्य प्रक्रिया है कि है कि इस प्रक्रिया का एक बच्चा नहीं है की वातावरण चर कभी नहीं बदल सकते हैं। तो जब स्क्रिप्ट निकलती है, तो आप अपने द्वारा किए गए सभी परिवर्तनों को खो देते हैं।

अच्छी खबर रजिस्ट्री में क्या माइक्रोसॉफ्ट विंडोज स्टोर वातावरण चर है और यह व्यवस्था करने के लिए propagate वातावरण चर करना संभव है।

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) 
1

के लिए किसी और को इस के लिए एक समाधान के लिए देख रहा है और एक हैक में या प्रवेश करने की आवश्यकता नहीं है कि का एक और अधिक की तलाश में बाहर मैं के लिए इस समाधान के साथ आया था: यह कैसे प्रसारण रूबी में किया जा सकता है एक ऐसी ही समस्या:

वैकल्पिक हल:

मेरा काम के आसपास माणिक के संयोजन और एक कमांड लाइन उपयोगिता विन्सेंट Fatica द्वारा develped SETENV.EXE कहा जाता है पर निर्भर है। यह इस बिंदु पर एक दशक से अधिक पुराना है लेकिन विंडोज एक्सपी में ठीक काम करता है (अभी तक विंडोज 7 के तहत परीक्षण नहीं किया गया है)। यह एमएस आईएमएचओ से उपलब्ध सेटएक्स उपयोगिता से बेहतर काम करता है। सामान को हटाने के लिए शायद नहीं। सुनिश्चित करें कि setenv कमांड लाइन से उपलब्ध है। इसे कुछ c: \ tools में रखें और अपने पैथ में c: \ tools डालें।

def switch_ruby_env 
    if RUBY_VERSION.match("1.8.7").nil? 
    `setenv -m CUSTOM_PATH " "` 
    else 
    `setenv -m CUSTOM_PATH -delete` 
    end 
end 
:

यहाँ यह का उपयोग कर एक विधि की एक छोटी सी उदाहरण है