|
|
楼主 |
发表于 2011-8-23 03:41:28
|
显示全部楼层
本帖最后由 defanive 于 2011-8-23 04:54 编辑
在顶楼的帖子里面部分明确,但有不同意的地方
关于每次都重新读取批处理文件:
我认为批处理每执行一次就会重新读取一次批处理文件,如下例
先将批处理内容写为
@echo off
pause
运行批处理,在暂停的时候将批处理改为
@echo off
pause
pause
回到CMD按任意键后可以发现出现了按任意键继续的提示,说明CMD重新读取了一次批处理文件
关于不是分行读取批处理:
平常我们都认为CMD是一行一行读取批处理后分别处理并执行的
我认为CMD是从文件标记处开始一直读取,找到下一个合法的换行符之后设置文件标记并执行
下例说明了CMD不是分行读取并分行执行的
@echo off
echo a^
b
pause
此处充分说明了不是分行读取的,因为若是这样的话^号没有转义目标直接显示出a
下例说明CMD是以设置文件标记的方式往下运行的,先将批处理内容写为
@echo off
pause
echo 123
pause
然后运行批处理,在暂停的时候将批处理改为
echo off
pause
echo 123
pause
然后回到CMD并按继续,可以发现提示'cho'不是内部或外部命令
此例充分说明了CMD是以设置标记的方式读取的
运行到第一次pause时设置的标记是在文件的第18字节处(即是echo 123的开始),但是我们在运行时将@去掉使得文件往前移动了1字节,即此时第18字节对应的是cho 123,必然出现错误信息
关于边预处理边找新行、三个符号%^"实际是同时预处理:
平常认为是CMD找到了分行之后再进行预处理,我认为预处理与找新行是同时进行的
@echo off
set "a=^"
echo a%a%
b
pause
上例说明了预处理与找新行是同时的
因为如果是找到新行再进行预处理,则必然会显示a和'b'不是内部和外部命令
而事实是在找新行之前已经把%a%替换成了^号,并且^号把下面的回车换行符转义了,因此会继续寻找到pause之前,显示出ab
同时这也说明了%、^、"这三个符号是同时进行预处理,而不是像顶楼帖子所说的“先预处理完%,再进行^与"的并行预处理”
因为如果是先处理完%的话,此时^号并没有预处理,则回车换行符没有被转义,那么仍然应该显示a和'b'不是内部和外部命令
但事实是显示了ab,说明在替换完%之后,则同时继续进行了^和"的预处理
顶楼的帖子说明了这三者的优先级顺序,%总之处于最高优先级,"和^处于并列优先级 |
|