Windows环境变量嵌套的限制?

时间:2010-08-29 13:05:32

标签: windows variables environment nested

那么,环境变量在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%

所以我没有看到明显的原因让他们无法扩展..

5 个答案:

答案 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=somethingY=%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中的值。如果所有变量都在用户中,效果可能会更好,但是我还没有检验这个假设。