Windows 环境变量嵌套有限制吗?

问题描述 投票:0回答:6

那么,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%

所以我没有看到明显的原因来阻止它们扩张..

windows variables environment nested
6个回答
14
投票

看起来变量定义存在字典顺序依赖性。

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
投票

是的,这让我发疯。完整重现:

系统属性,环境变量,设置如下:

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

...乔纳斯


1
投票

我已经成功地转义了百分号:

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
)。


0
投票

您是否也将所有需要的变量保存在系统变量中?因为为了扩展值,系统必须拥有所有所需变量的“永久”内存。

如果您在命令行上连续执行所有这些操作,只需说出

X=something
Y=%X%;else
,那么当您将路径设置为
PATH=%PATH%;%Y%
时,shell 会展开它保存的所有变量 before 的值PATH 的新值;但一旦你关闭命令提示符窗口,系统就完全忘记了%X%和%Y%。

但是,如果您使用系统属性控制面板将 PATH 设置为包含未展开的变量,则所有这些变量在您重新启动时都必须作为系统变量存在,否则它们将无法展开。

要确保保存系统中的所有变量以便它们在重新启动后仍然存在,请使用系统属性控制面板或SETX.EXE命令。如果您要在系统路径(不仅仅是您的用户帐户的路径)中使用它们,那么您将需要使用

SETX /M X=blah
或系统属性 | 的底部部分。环境变量选项卡,标记为“系统变量”。


0
投票

我在 Windows 10 build 1903 中遇到过这种情况。

对我来说,解决方案是从“用户”(系统属性对话框的上半部分)中删除

PATH
变量,并仅保留“系统”中的路径。重新启动 cmd.exe shell 或使用
refreshenv
重新加载属性,扩展应该会再次起作用。

这看起来像是 Windows 中的一个错误,因为它如何解析用户与系统属性,或者可能是处理顺序。对我来说,它不会用“系统”环境变量集中的值替换用户路径中的值。如果所有变量都在用户中,它可能会工作得更好,但我还没有测试这个假设。


0
投票

我设法通过创建快捷方式并在快捷方式路径中使用所需的环境变量来解决该问题。

就我而言,我有两个 vulkan sdk 安装,

C:\VulkanSDK\1.3.250.1
C:\VulkanSDK\1.3.268.0
。我创建了变量
VK_VERSION
,其值为
1.3.250.1
,并在
vk_current_version
中创建了一个名为
C:\VulkanSDK\
的快捷方式,指向
C:\VulkanSDK\%VK_VERSION%

我现在可以简单地在其他环境变量和脚本中使用

C:\VulkanSDK\vk_current_version\
作为正常路径。如果我将
VK_VERSION
的值更改为
1.3.268.0
所有用法现在均参考更高版本。

注意:像

PATH
变量这样的东西似乎只在注销/登录时重新评估,所以如果旧值仍然存在,请尝试这样做。

© www.soinside.com 2019 - 2024. All rights reserved.