我想在一个命令中执行此操作:
set myvar="hello" && echo %myvar%
得到"你好"屏幕上。 但我得到%myvar%而不是。如何立即完成扩展,以便我得到"你好"?
修改 使用尖括号时的外观如何:
set "var=<hello>"& echo %^var%
答案 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
但如果您的变量内容可能嵌入了引号,则会出现问题。