[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 3# sincos2007


    我是这样理解的:
此行代码为:echo %str1%
执行前,先进行一次预处理,变为:echo abc   %%var1%%   !!var2!!   mmm   !var3!
执行时不会再扩充%,故前面是一样的。第一个感叹号配对无效没了,第二、三两个感叹号之间的扩充因为var2未定义一起消失了,第四、五两个感叹号同理带着中间一串一起消失,最后一个感叹号也没得配对消失了,只剩下没被扩充的var3
因此最终回显结果是:abc %%var1%%   var3
而且中间的空格是来自var1与var2之间的,和var3前面的那一段空格没有任何关系。你可以把var3前面的空格拉长再比较一下结果,就更好理解了。

关键在于对!扩充的理解。找准第一对能扩充的!,而不是第一对好像配对了的!。
如以下代码:setlocal enabledelayedexpansion&set a=123&echo !!a!&pause
最终显示结果会是123。事实上,a前后的感叹号再多都不会有影响。
而如果执行代码:setlocal enabledelayedexpansion&set a=123&echo ! !a!&pause
最终显示结果会是a。因为第一对!!中间有东西,于是扩充掉了,a就不能扩充了。

TOP

第二部分好像差不多,不过一起分析一下吧。

第一句set,预处理后:set "str2=abc   %%var1%%   ^!^!var2^!^!   mmm   !var3!"
执行时把str2设为:abc   %%var1%%   !!var2!!   mmm
前几个!有^转义,因此保留,最后一对直接扩充了。

第二句,就是把str2真正的结果直接给出来,和设的东西是一样的。

第三句,用!!包起来,只在执行的时候把!!扩充一下,因此里面的东西没有机会再扩充(除非set/a里面不用任何东西包起来的变量还会再扩一下),故结果和第二句没差。

第四句,执行前预处理,执行时遇到的命令是:echo abc   %%var1%%   !!var2!!   mmm
于是!!继续扩充,具体原理与上一楼是一样的。%只在预处理的时候扩充的。

希望能帮到你。

TOP

返回列表