我想这样做在一个命令:命令行变量的延迟扩展
set myvar="hello" && echo %myvar%
,并得到“你好”在屏幕上。 但我得到%myvar%。这个扩展如何立即完成,所以我得到“你好”?
编辑: 如何看待用尖括号时,如:
set "var=<hello>"& echo %^var%
我想这样做在一个命令:命令行变量的延迟扩展
set myvar="hello" && echo %myvar%
,并得到“你好”在屏幕上。 但我得到%myvar%。这个扩展如何立即完成,所以我得到“你好”?
编辑: 如何看待用尖括号时,如:
set "var=<hello>"& echo %^var%
选项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" && call echo %myvar%
这只适用于myvar在开始时未定义的情况。如果它已经被定义,则原始值被回显。 – dbenham 2015-02-09 17:22:24
可以针对各种可能的情况进行此项工作,例如也为echo%myvar:〜1,-1%,我想排除第一个和最后一个符号 – Sandra 2015-02-09 17:46:59
@Sandra - 当然。脱字符可以是开头百分比和冒号之间的任何地方。试一试。 – dbenham 2015-02-09 17:49:31
你最近的意见,避免延期扩张,是不是应该设置myvar = 没有逃脱?它究竟做了什么? – Sandra 2015-02-10 15:05:08