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