문제

루비에서 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과 마찬가지로입니다 말한다, 프로세스는 해당 프로세스의 자녀가 아닌 다른 프로세스의 환경 변수를 직접 변경할 수 없습니다. 따라서 스크립트가 종료되면 모든 변경 사항을 잃습니다.

좋은 소식은 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)  

다른 팁

이를위한 솔루션을 찾고 다른 사람에게는 로그인 또는 아웃을 필요로하지 않는 해킹을 더 많이 찾고 있습니다. 비슷한 문제에 대해이 솔루션을 제시했습니다.

해결 방법 :

내 작업은 Ruby와 Command Line 유틸리티의 조합에 달려 있습니다. setenv.exe Vincent Fatica에 의해 개발되었습니다. 이 시점에서 10 년이 넘었지만 Windows XP에서는 잘 작동합니다 (아직 Windows 7에서는 테스트하지 않았습니다). MS IMHO에서 사용할 수있는 SETX 유틸리티보다 더 잘 작동합니다. 물건을 삭제하지 않을 것입니다. setenv를 명령 줄에서 사용할 수 있는지 확인하십시오. 일부 C : 도구에 넣고 경로에 C : 도구를 넣으십시오.

다음은 다음을 사용하는 방법의 짧은 예입니다.

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