问题
如何在注册表键值中使用系统变量全局变量,系统变量在注册表的值中失效,注册表中值上写了系统变量不解析
上面这个问题困扰了我挺久,然后单独一篇文章做下记录
之前在写reg文件的时候发现我增加到注册表的自定义系统变量都不能用
像%TEST_HOME%写入到注册表的值中并不能被正常解析,但是在cmd中用echo %TEST_HOME%是可以正常输出变量的值的。
网上查了不少资料后发现可以利用cmd /c的方式使系统变量在注册表中生效。
例子:
我在环境变量里面新建了个系统变量
然后再cmd里面执行echo %TEST_HOME%可以正常输出变量的值,也就是D盘的路径
然后我修改了注册表的键值
但是我发现%TEST_HOME%并不能正常解析成D:\mytest\path
从而导致D:\mytest\path\bin下的服务不能正常使用
修改成绝对路径是可以正常使用服务的,但是这样会造成很大的麻烦,如果%TEST_HOME%变量能正常用,则会省去很多麻烦
解决方法
在键值前面加上 cmd /c 成功使变量正常工作
个人理解
仅是个人猜测理解,不确定是否真实原理是这样,不保证理解正确性,希望有大佬帮忙解释下原因
cmd /c 效果是是执行完后面的命令后关闭命令窗口
比如cmd /c dir是执行完dir命令后随即关闭命令窗口
很有可能是由于注册表中的键值,先被cmd执行了,因为在cmd中是可以正常理解%TEST_HOME%变量的,所以加上cmd /c后系统先做的操作应该是尝试用cmd /c去运行后面路径,因为路径中含有变量,所以变量成功被解析,和后面正常的路径一起作为注册表键值的输入,从而达到了在注册表中直接用绝对路径的效果。一句话说就是中间用cmd做了个过渡。