2015-02-09 114 views
0

我想这样做在一个命令:命令行变量的延迟扩展

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

,并得到“你好”在屏幕上。 但我得到%myvar%。这个扩展如何立即完成,所以我得到“你好”?

编辑: 如何看待用尖括号时,如:

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

回答

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 

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

+0

可以针对各种可能的情况进行此项工作,例如也为echo%myvar:〜1,-1%,我想排除第一个和最后一个符号 – Sandra 2015-02-09 17:46:59

+0

@Sandra - 当然。脱字符可以是开头百分比和冒号之间的任何地方。试一试。 – dbenham 2015-02-09 17:49:31

+1

你最近的意见,避免延期扩张,是不是应该设置myvar = 没有逃脱?它究竟做了什么? – Sandra 2015-02-10 15:05:08

0

假设你想在命令行这样做,因为在一个批处理反对:

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

这只适用于myvar在开始时未定义的情况。如果它已经被定义,则原始值被回显。 – dbenham 2015-02-09 17:22:24