VC++ 环境变量获取记录

108 阅读2分钟

 VS调试时,多次运行获取的环境变量都相同(程序中使用system),原因如下:

c++ - VC++ doesn't detect newly created env variable using GetEnvironmentVariable - Stack Overflow

问题分析:
   在启动startup.bat中加入了 echo "%CATALINA_HOME%" >> c:\a.txt

   直接执行时,打印的内容"E:\tomcat\apache-tomcat-8.5.65",与系统环境变量配置一致

   高可用切换时,打印的内容为空即高可用程序切换时缺少了tomcat所需要的环境变量

类似现象:
    打开CMD窗口, 输入语句:echo "%CATALINA_HOME%" 会看到打印结果正常此后,将环境变量中的CATALINA_HOME修改为E:\tomcat\apache-tomcat-8.5.65_test, 再在原来的CMD窗口中执行echo "%CATALINA_HOME%",发现结果没有变化  此时只有新打开一个CMD窗口,输出的变量值才是修改后的E:\tomcat\apache-tomcat-8.5.65_test

    附:CMD中直接输入set,执行将输出所有的环境变量

原因解释:
    高可用程序和CMD进程一样,只在启动时获取了一次环境变量配置手动配置解压版的tomcat后,新的环境变量没有被重新获取

解决方法:
    在配置了新的环境变量后,需要重启高可用程序,重新获取环境变量 
    或者在脚本中给使用的新环境变量指定内容
    

注册表中的环境变量(修改注册表或系统中设置环境变量,两者会相互实时同步)

用户的:

Computer\HKEY_USERS.DEFAULT\Environment

系统的:

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

此处:如果系统和用户的有共同变量名的,会以用户的为准。猜测读取时先读系统的,再读用户的。

变量值中有%%,  需要自己来处理吧。

注册表获取脚本示例

Reading values out of the Windows Regist - C++ Forum

程序修改变量示例(只作用到当前程序):

Changing Environment Variables - Win32 apps | Microsoft Learn