注意,7楼tireless兄的代码与楼主提到的形式不是同一个类型。- @echo off
- echo !^^^^^>
- setlocal enabledelayedexpansion
- echo !^^^^^>
- set "var=^^^^^>"
- echo !var!
- pause
复制代码 setlocal EnableDelayedExpansion 启用延迟的变量扩展,的确仅仅是“单纯”地延迟扩展变量。但变量总是要展开的,预处理时变量扩展被延迟了,必然还有一次对变量进行展开的处理。这次处理是依据语句中有没有!进行的,而不是根据有没有!对。于是这种依据产生了一个缺陷:对任何含有!的语句都要进行再次处理。
已分析出的结论:语句的结构和功能是在预处理时决定的。
对于echo !var!,预处理时从该句中没有发现&、|、>等功能字符,判定这一句的功能是一条普通的显示命令,再次处理时直接将展开后的变量值原样输出。
而echo !^^^^^>,由于后面>被^转义,系统判定这一句的功能也是一条普通的显示命令,而不是重定向。预处理后该句变为echo !^^>。由于该句包含!,于是要被再次处理。注意^^>并不是包含于!对,这次处理并不是对该句进行变量展开,而是对这一条语句进行普通处理。^还是转义符,但根据上面的结论>不再有重定向功能,相当于普通字符。
根据这些原理不难分析下面的代码:- echo off&setlocal enabledelayedexpansion
- set "^^^^^>=1"
- echo !^^^^^^^^^^^>!
- pause
复制代码
[ 本帖最后由 zqz0012005 于 2009-3-27 10:50 编辑 ] |