如何在DOS和Windows CMD中抑制环境变量的扩展?

9
这是一个使用修改后的变量名称简化示例,展示了我想要做的事情。为了简单起见,我展示了命令行版本而不是批处理版本。
我正在执行以下操作。
> echo %foo%

%foo%

然而,如果foo是一个有效的环境变量,由于环境变量扩展,我将无法获得期望的输出(%foo%)。

> set foo=bar
> echo %foo%
> echo %%foo%%

bar
%bar%

现在,我有一个技巧(如下例所示)可以实现这个功能,但我想知道是否有更简洁的方法来输出%字符或抑制环境变量扩展。

> set foo=bar
> set percent=%
> echo %percent%foo%percent%

%foo%

此外,如果所需解决方案在 bat 文件中与默认不同(例如使用 %% 而非 % 或者 %1% 而非 %1),请告诉我。

我的实际用例是在一个带有 SETX 命令的 bat 文件中设置依赖于其他环境变量扩展的全局环境变量,但我很好奇如何在 DOS 或 cmd 中进行扩展。


你能解释一下“依赖于另一个环境变量在其中被扩展”的意思吗?你想在可解析的字符串中进行一些嵌套扩展,但不是全部吗? - cdkMoose
@cdkMoose:我想将全局环境变量设置为类似于FOO_SDK_BIN=%FOO_SDK%/BIN的东西,但不要使用SETX来展开%FOO_SDK%。然后,如果我使用SETX更改了FOO_SDK变量路径,则所有依赖它的变量也将被正确地重新定位。这只是为了创建一个脚本,简化我们使用第三方SDK的许多类似此类的环境变量的开发机器的设置。 - Adisak
我不熟悉SETX,但听起来你是说你不想让它与SETX一起扩展。"我想设置一个全局环境变量,例如FOO_SDK_BIN=%FOO_SDK%/BIN,但不要使用SETX扩展%FOO_SDK%。" 但是之后你又希望在使用SETX更改变量值后进行扩展。在任何一个语句中,它要么会扩展,要么不会扩展,但不能同时存在。 - cdkMoose
SETX可以设置全局环境变量(在其他命令提示符和应用程序中可见)- 这些变量存储在注册表的HKCU和HKLM中(使用/M)。自VISTA以来,它就作为操作系统的一部分存在,并且是XP的补充工具的一部分。基本上,这些变量存储在"高级系统设置"控制面板的"高级"选项卡下的"环境变量"按钮下。 - Adisak
请注意,setx 不是 DOS 命令。DOS 和 cmd.exe 不是同一件事情 - phuclv
2个回答

9
在批处理文件中,echo %%foo%% 将生成 %foo%。
c:\01Temp>type foo.bat
@echo %%foo%%

c:\01Temp>foo
%foo%

c:\01Temp>

3
啊!我被搞糊涂了,因为如果 foo 已经被设置了(在命令行上 %%foo%% 展开为 %bar%),那么这个方法就不起作用了。除了这种折中的方法(设置 percent=%)外,还有其他在命令行上实现它的方式吗? - Adisak

2
在批处理文件中,请使用两个%%,例如:
set foo=1
echo %%foo%%

...回显的是"%foo%",而不是"1"。我不知道有没有办法在立即模式下禁用它(例如,不在批处理文件中)。


是的,我感到困惑,因为无论我连续输入多少个百分号,在即时模式下它都不能按照我想要的方式工作。 - Adisak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接