那么,环境变量在Windows中嵌套的深度是否有限制?我做了很多开发工作,我正在尝试建立我的开发环境变量,并且很多都是相互嵌套的,即。
GLEW=%THIRD_PARTY_ROOT%\GLEW
GLEW_1_5_5=%GLEW%\glew-1.5.5
GLEW_BIN_PATH=%GLEW_ROOT%\bin
GLEW_INCLUDE_PATH=%GLEW_ROOT%\include
GLEW_LIB_PATH=%GLEW_ROOT%\lib
GLEW_ROOT=%GLEW_1_5_5%
OSG=%THIRD_PARTY_ROOT%\OpenSceneGraph
OSG_2_8_3=%OSG%\OpenSceneGraph-2.8.3
OSG_BIN_PATH=%OSG_ROOT%\bin
OSG_INCLUDE_PATH=%OSG_ROOT%\include
OSG_LIB_PATH=%OSG_ROOT%\lib
OSG_ROOT=%OSG_2_8_3%
THIRD_PARTY_ROOT=C:\dev\third-party
但我有一段时间让他们真正适当地扩展。有一段时间,当我查看set的输出时,我只是得到了他们正在按顺序展开的东西,所以任何依赖于foo_ROOT的东西都没有被正确扩展。我尝试启用延迟扩展并没有帮助,但重启似乎......所以可能延迟扩展需要重新启动..
无论哪种方式,我的PATH变量中都有GLEW_BIN_PATH和OSG_BIN_PATH,它们拒绝扩展。这真是令人沮丧,因为dll正存在那里,当然我可以得到其他东西来扩展...任何想法?
编辑:我在PATH变量中将它们作为:
[everything else....];%GLEW_BIN_PATH%;%OSG_BIN_PATH%
所以我没有看到明显的原因让他们无法扩展..
答案 0 :(得分:13)
看起来对变量定义存在字典依赖。
Windows按字典顺序扩展和填充环境变量(: - O)
您只能对您的变量使用"字典顺序"低于你的变量。
实施例: 定义如下:
VAR_01=1
VAR_02=%VAR_01%-2
VAR_03=%VAR_02%-3
可生产
VAR_01 is 1
VAR_02 is 1-2
VAR_03 is 1-2-3
但是
VAR_01=1
VAR_02=%VAR_03%-2
VAR_03=%VAR_01%-3
可生产
VAR_01 is 1
VAR_02 is -2
VAR_03 is 1-3
展开VAR_02时未定义到期VAR_03。
答案 1 :(得分:1)
系统属性,环境变量,设置如下:
one = c:
two = %ONE%\two
three = %TWO%\three
然后单击“确定”,然后运行cmd。这就是我所看到的:
C:\>set one
one=C:
C:\>set two
two=C:\two
C:\>set three
three=%TWO%\three
这个链接解释了Vista,但没有提到它发生在Win7上。 http://support.microsoft.com/kb/911089
...纳斯
答案 2 :(得分:0)
您是否也在系统变量中保存了所有必需的变量?因为为了扩展值,系统必须具有所有所需变量的“永久”记忆。
如果您在命令行中连续一起执行所有这些操作,只需说出X=something
和Y=%X%;else
,那么当您将路径设置为PATH=%PATH%;%Y%
时,shell会扩展所有变量在之前保存了PATH的新值;但是一旦关闭命令提示符窗口,系统就会完全忘记%X%和%Y%。
但是,如果使用“系统属性”控制面板将PATH设置为包含未展开的变量,则重新引导时所有这些变量必须作为系统变量存在,否则它们将无法扩展。
要确保保存系统中的所有变量,使其在重新引导后仍然存在,请使用“系统属性”控制面板或SETX.EXE命令。如果您要在系统PATH中使用它们(而不仅仅是您的用户帐户的路径),那么您将需要使用SETX /M X=blah
或系统属性的底部部分。环境变量选项卡,标记为“系统变量”。
答案 3 :(得分:0)
我在逃避百分号方面取得了成功:
GLEW=%%THIRD_PARTY_ROOT%%\GLEW
THIRD_PARTY_ROOT=C:\dev\third-party
C:\>set GLEW
GLEW=C:\dev\third-party\GLEW
从 Windows环境变量窗口查看变量时,它将显示为
GLEW | %THIRD_PARTY_ROOT%\GLEW
注意:双百分号仅适用于脚本。如果在命令行上使用,请使用脱字符转义字符(例如GLEW=^%THIRD_PARTY_ROOT^%\GLEW
)。
答案 4 :(得分:0)
我在Windows 10(内部版本1903)中遇到过这种情况。
对我来说,解决方案是从“用户”(系统属性对话框的上半部分)中删除PATH
变量,仅将路径保留在“系统”中。重新启动cmd.exe shell或使用refreshenv
重新加载属性,并且扩展应该再次起作用。
这看起来像Windows中的错误,它解决了用户属性与系统属性或处理顺序的关系。对我而言,这并不是用用户环境变量“系统”集中的值替换用户PATH中的值。如果所有变量都在用户中,效果可能会更好,但是我还没有检验这个假设。