为什么环境变量只能扩展到一定程度的嵌套?

为什么环境变量只能扩展到一定程度的嵌套?

我发现在使用环境变量时存在一些令人困惑的行为。如果我有两个环境变量,一个指向另一个,当我引用指针变量时,它将自动取消引用,我将获得它指向的变量的值;就像下面这样,c_test 等于 foo,当我回显 c_test 时,我得到了 foo。b_test 指向 c_test,当我回显 b_test 时,我得到了 foo。我期望由于 a_test 等于 b_test,所以当回显 a_test 时,我应该得到 foo;但我没有。这里发生了什么?我期望取消引用会链接起来,但由于某种原因,事实并非如此。

在此处输入图片描述

答案1

首先,这不是 MS-DOS。Cmd.exe 大致基于 command.com(DOS 提示符),但仅此而已。它与旧时代有很大不同,但(大部分)向后兼容。

此外,您看到的行为与命令提示符无关。此行为存在于 Windows 启动的每个进程中。

为什么你会看到所描述的行为

两个原因之一(或两个原因都存在)

可能原因一:
Windows 对列表中显示的环境变量进行一次遍历。当 Windows 调用 ExpandEnvironmentStrings() 函数时,_BTest 尚未解析。为了实现您期望的结果,Windows 需要在整个列表中反复调用此函数,直到没有剩余内容需要解析。

可能原因二:
Windows 使用注册表项来存储此信息。为了使此功能首先起作用,注册表项必须具有 REG_EXPAND_SZ 类型,而不是 REG_SZ 类型。

打开注册表编辑器并查看HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment。您将在那里看到这些键类型。您不能直接更改类型(不幸的是),您需要使用虚拟名称创建一个所需类型的新键,复制数据,删除(或重命名)原始键,将虚拟键重命名为您想要的名称。

相关内容