|
|
发表于 2012-1-13 00:19:09
|
显示全部楼层
如果同一问题最好一起讨论,免得东找西找的。
楼主可能是想问,&&在判断成功的时候,它怎么知道它前面的代码执行成功,执行成功是不是意味着cmd在&&之前执行了一遍之前的代码?如果执行了,这些执行结果显示在哪里?
个人理解,批处理在解析命令行时,确实存在一个预处理机制,但我认为这个机制是针对命令所执行到的位置的,一个长长的bat代码,它并非一次性预处理完成,而是运行到哪里预处理到哪里,那么,这个预处理就是命令的执行过程中的解析一环了。解析的意义就在于,判断命令是否可以执行!预处理最根本的就是——判断命令是否存在错误!而不是判断命令如何执行。因此,当批处理预处理到该条命令时,它不是去尝试如何获得命令执行结果,而是按照基本规则去判断该条命令是否可以执行,如果不符合语法,不符合基本的执行条件则返回返回码,如果能执行则直接执行。最简单的判断就是dir和for,使用dir来搜索文件,如果批处理先让dir来运行再判断该命令是否成功执行了,这是很耗费时间的。我们遇到的for /l问题,第一次似乎它没有执行循环,但第二次时它就会先执行再判断了,所以第二次执行时我们发现它会将集合内的元素全部预处理了一遍,这个预处理跟第一个预处理是不同的。——例子找不到了,麻烦。
有时候&&与start /wait 差不多,执行完了才判断。有时候也存在一种情况,你在一个pause后面放一些特殊符号,批处理会直接跳过pause而发生错误,但有时候我们把特殊符号放后面它又没有什么问题。所以,预处理也不仅仅限于所执行到的一行,可能与优先处理的问题有关。我说的第一次预处理是指判断命令是否符合语法、是否存在基本执行条件,第二次预处理就是你们说的,解析命令怎么执行的,有个判断优先级。 |
|