[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
我理解的批处理优先级如下,从上到下按从高到低排序:
%1
%
()                         【没被转义的括号是语块的划分符号,所以for命令和if命令其实本质应该不是语句,而是语块】
&和|和&&和||
>和<
%%a                   【执行时,因为%%已被转义,所以其实执行的是%a】
空格以及他分隔符
"和^                     【for /f中的“"”存在特例,对此我也不是很理解】
!

不知道还有没有漏的

TOP

而call echo %%a%%的实质大概是它运行的是cmd /k echo %%a%%
此时在父cmd中进行了第一级预处理,变成cmd /k echo %a%,然后在子cmd中再解释变量a,由于子进程继承了父进程的变量环境,所以变量a能够被成功地延迟扩展。
值得一提的是,call命令对for命令和if命令似乎没辙,我到现在为止坚持认为for命令和if命令是最特殊的两个命令,因为它们都包含着语块,典型的例子是for,for命令的输出和输入都是语块,这是别的命令做不到的,虽然cmd命令也有“cmd /c "语句一&语句二&语句三"”这种类似于语块的用法,但其实现执行语块的本质还是将语块作为参数传递给子cmd。所以我猜测call命令可能无法解读语块,具体原因不明。

TOP

14# qzwqzw


有道理,我武断了

TOP

我觉得把,批处理方面比较权威和系统的资料真的很少,不像c和delphi……
很多东西只能慢慢摸索……

TOP

11# qzwqzw

汗?确实可以,受教了

TOP

17# zm900612


经测试,没有发现新的cmd.exe进程

call call call (ping /n 50 127.0.0.0)

TOP

21# applba


有的,测试过的了。
不过先前没注意到的是,不管有多少层call,似乎只创建了一个新cmd进程,看来还有猫腻

TOP

发现call ping不像call pause,真的没有多余进程

TOP

明白了,pause是内部命令

TOP

本帖最后由 applba 于 2011-5-16 23:48 编辑

13# qzwqzw


关于优先级的看法,我觉得你的还是很合理……

因为之前看了英雄的教程,也提到优先级的问题,但是解释不是很合理,有些地方还矛盾……

所以我自作聪明弄了一个新看法……

看来又要重写了。

补充一个问题:
是不是每个特殊符号的处理都是单独的一轮?

TOP

本帖最后由 applba 于 2011-5-17 02:30 编辑

16# zm900612


我觉得把,还是要区分一下特殊字符的处理时机的,是读取时还是运行时,这两个时机处理的内容是有差别的。
读取时只处理(%,",^)这三个符号的,其他的什么命令分隔符(& && ||)、重定向符号等是不处理的。
比如在读取时,不管是否开启变量延迟,都是不会处理感叹号的,感叹号的处理是在运行时由具体的命令处理。
    如果你没有开启变量延迟,set/a会把!解释成逻辑非,而其他命令把它识别为普通符号。
    开启变量延迟后,所有的命令都会把它识别延迟符号,并启动解释工作。

比如 ,%(%%、%n,%%i ,%a%)的解释是发生在读取时的,这个是无条件解释的,此时命令还没有被执行的。(当然了如果call会导致重新识别%为特殊字符,运行时再次进行解释。)再如 &、&&  ||等,读取时是不被解释的,他们是在运行时由具体的命令进行解释,因为cmd.exe在读取时是不知道命令是执行成功还是执行失败的。

空格等分隔符是专用的特殊符号,只能由一些命令在运行时进行解释,cmd.exe在读取时是不处理这些符号的。

TOP

19# applba


这就是在Windows里面写代码的悲哀啦,木有办法啊。
不像Linux,哪个命令的机制想不清楚了,看看源代码,于是豁然开朗。最近看到的一个例子:
http://blog.csdn.net/sosodream/archive/2011/05/16/6425192.aspx
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

学了两个月批处理,又想学学python了……

TOP

17# zm900612


不记得谁说过:
for和if是高级语句,相当于一个命令解释器,他们能独立的对后面的语句块进行解释……

TOP

17# zm900612


不记得谁说过:
for和if是高级语句,相当于一个命令解释器,他们能独立的对后面的语句块进行解释……
applba 发表于 2011-5-18 01:13

确实,这个看法比我的观点更明晰准确,看来我以后要改口了

TOP

返回列表