延迟扩展命令行变量

Delayed expansion of command line variables

我想用一条命令完成:

set myvar="hello" && echo %myvar%

并在屏幕上显示 "hello"。 但我得到的是 %myvar%。如何立即完成此扩展,以便我得到 "hello"?

编辑: 使用尖括号时它看起来如何:

set "var=<hello>"& echo %^var%

假设您想在命令行而不是批处理中执行此操作:

set myvar="hello" && call echo %myvar%

选项 1 - 使用 CALL 获得额外一轮扩展

CALL 命令引入了额外的一轮扩展。但是您不希望在执行 CALL 之前扩展变量,否则您将获得该行执行之前存在的值(假设它已经存在)。所以你需要一种延迟扩展的方法。

在批处理脚本中,您可以使用 call echo %%myvar%%,但双倍百分比在命令行中不起作用。

让它在命令行上工作的诀窍是在名称中引入一个消失的插入符号。正常扩展将插入符解释为名称的一部分,因此找不到变量,也不会扩展任何内容。插入符号在 CALL 扩展之前被消耗,因此获得了正确的结果。

set "myvar=hello"&call echo %^myvar%

请注意,这在名为 ^myvar 的变量实际存在的不太可能的情况下不起作用。

选项 2 - 持续启用延迟扩展

cmd /v:on
set "myvar=hello"&echo !myvar!

选项 3 - 暂时启用延迟扩展

set "myvar=hello"&cmd /v:on /c echo !myvar!


已编辑问题的更新

如果您的变量包含 <> 等有害字符,那么您最好的选择是使用选项 2 或 3,因为延迟扩展不受有害字符的影响。

您可以使用选项 1 的明显方法是在定义期间转义有毒字符。

set "myvar=^<hello^>"&call echo %^myvar%

不是一个非常实用的解决方案。

我想您可以执行以下操作以避免延迟扩展并避免修改内容:

set "myvar=<hello>"&for /f "delims=" %A in ('echo ^"%^myvar%^"') do @echo %~A

但是如果您的变量内容可能嵌入引号,这可能会出现问题。