سؤال

أحاول تعيين متغير بيئة DOS الخاص بي في Ruby، وجعله يستمر بعد خروج البرنامج النصي.على سبيل المثال، إذا كنت أريد برنامج نصي روبي set_abc_env.rb لتعيين متغير البيئة "ABC" على "بلاه"، أتوقع تشغيل ما يلي:

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 يقول وهي عملية لا يمكن أبدا أن تتغير بشكل مباشر على متغيرات البيئة من عملية أخرى ليست طفل من تلك العملية. لذلك عندما يخرج السيناريو، وتفقد كل التغييرات فعلت.

والخبر السار هو ما المتغيرات مخازن بيئة 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 لإجراء تغييرات ينظر إلى التطبيقات. هذه هي الطريقة البث يمكن القيام به في روبي:

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 طورها فنسنت فاتيكا.لقد مضى عليه أكثر من عقد من الزمان في هذه المرحلة ولكنه يعمل بشكل جيد في نظام التشغيل Windows XP (لم يتم اختباره ضمن نظام التشغيل Windows 7 بعد).إنه يعمل بشكل أفضل من الأداة المساعدة setx المتوفرة من MS IMHO.على الأقل لحذف الأشياء.تأكد من توفر setenv من سطر الأوامر.ضعه في بعض الأدوات c: ools ثم ضع c: ools في المسار الخاص بك.

فيما يلي مثال قصير لطريقة استخدامه:

def switch_ruby_env
  if RUBY_VERSION.match("1.8.7").nil?  
    `setenv -m CUSTOM_PATH " "`
  else
    `setenv -m CUSTOM_PATH -delete`
  end
end 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top