从资源管理器启动cmd-line时,环境变量未正确解析

时间:2014-11-18 08:11:57

标签: windows cmd environment-variables

我使用rapidEE.exe设置了一些环境变量:

OPENCV_HOME=D:\opencv249
OPENCV_LIB=%OPENCV_HOME%\build\x86\vc10\lib
OPENCV_BIN=%OPENCV_LIB%\..\bin

并保存&重启我的win7。然后我打开(Shift +右键单击"在这里打开cmd窗口")与我的DESKTOP和DRIVE-C分开的两个cmd窗口,并回显变量,var %opencv_bin%未展开正确地在第一个 cmd窗口中,为什么?

从驱动器C:

C:\>echo %opencv_home%
D:\opencv249

C:\>echo %opencv_lib%
D:\opencv249\build\x86\vc10\lib

C:\>echo %opencv_bin%
%OPENCV_LIB%\..\bin

C:\>

来自桌面:

d:\Users\zhangxaochen\Desktop>echo %opencv_home%
D:\opencv249

d:\Users\zhangxaochen\Desktop>echo %opencv_lib%
D:\opencv249\build\x86\vc10\lib

d:\Users\zhangxaochen\Desktop>echo %opencv_bin%
D:\opencv249\build\x86\vc10\lib\..\bin

d:\Users\zhangxaochen\Desktop>

我定义的所有变量都是可扩展字符串enter image description here

1 个答案:

答案 0 :(得分:1)

也许我错了,如果是,那么抱歉,但真正的问题应该是为什么我在其中一个窗口中正确解析变量?

注册表中的环境变量读取操作按字母顺序完成。订单很重要。

读取所有变量后,将重新处理REG_EXPAND_SZ个变量,因此可以扩展取决于其他变量的值。但是如果你有一个REG_EXPAND_SZ变量,取决于按字母顺序更大的另一个REG_EXPAND_SZ变量,当处理第一个变量时,第二个变量仍然没有值,第一个变量将保存引用(不是值)到了第二个。这就是存储在创建过程的环境块中的内容。

因此,正常行为是您从C看到的,opencv_bin取决于opencv_lib未展开,因为它们都是REG_EXPAND_SZopencv_bin < opencv_lib

为什么然后在另一个窗口中获得不同的行为并替换变量?这取决于你是如何开始这两个窗口的,它们是每个窗口的父进程(可以改变,因为环境是从父对子继承的,这很重要),并且(这只是一个假设)如果您发布的数据是正确的,您似乎没有使用标准的Windows命令行:如何在提示符中获得小写的驱动器号?

无论如何,解决它的更简单方法是改变变量的初始化方式

OPENCV_BIN=%OPENCV_HOME%\build\x86\vc10\bin
OPENCV_HOME=D:\opencv249
OPENCV_LIB=%OPENCV_BIN%\..\lib

OPENCV_HOME更改为REG_SZ