命令行变量的延迟扩展

时间:2015-02-09 17:05:36

标签: command-line terminal command-prompt

我想在一个命令中执行此操作:

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

得到"你好"屏幕上。 但我得到%myvar%而不是。如何立即完成扩展,以便我得到"你好"?

修改 使用尖括号时的外观如何:

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

选项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

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