我使用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>
我定义的所有变量都是可扩展字符串:
答案 0 :(得分:1)
也许我错了,如果是,那么抱歉,但真正的问题应该是为什么我在其中一个窗口中正确解析变量?
注册表中的环境变量读取操作按字母顺序完成。订单很重要。
读取所有变量后,将重新处理REG_EXPAND_SZ
个变量,因此可以扩展取决于其他变量的值。但是如果你有一个REG_EXPAND_SZ
变量,取决于按字母顺序更大的另一个REG_EXPAND_SZ
变量,当处理第一个变量时,第二个变量仍然没有值,第一个变量将保存引用(不是值)到了第二个。这就是存储在创建过程的环境块中的内容。
因此,正常行为是您从C
看到的,opencv_bin
取决于opencv_lib
未展开,因为它们都是REG_EXPAND_SZ
和opencv_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