延迟扩展命令行变量
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
但是如果您的变量内容可能嵌入引号,这可能会出现问题。
我想用一条命令完成:
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
但是如果您的变量内容可能嵌入引号,这可能会出现问题。