[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 applba 于 2011-5-17 02:30 编辑

16# zm900612


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

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

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

TOP

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

13# qzwqzw


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

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

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

看来又要重写了。

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

TOP

明白了,pause是内部命令

TOP

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

TOP

21# applba


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

TOP

17# zm900612


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

call call call (ping /n 50 127.0.0.0)

TOP

11# qzwqzw

汗?确实可以,受教了

TOP

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

TOP

14# qzwqzw


有道理,我武断了

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

我理解的批处理优先级如下,从上到下按从高到低排序:
%1
%
()                         【没被转义的括号是语块的划分符号,所以for命令和if命令其实本质应该不是语句,而是语块】
&和|和&&和||
>和<
%%a                   【执行时,因为%%已被转义,所以其实执行的是%a】
空格以及他分隔符
"和^                     【for /f中的“"”存在特例,对此我也不是很理解】
!

不知道还有没有漏的

TOP

1# applba
Command.com最初是MS-DOS的命令解释程序,在Windows XP中依然得到了继承,它可以实现cmd.exe的大多数功能。

记得有一篇将Windows中的命令行的帖子
其中就主要讨论了cmd与command的关系
简单来说
Windows NT系列的command.com
是为了兼容MS-DOS时代的16位程序而存在的
是16位dos程序的命令行入口程序
其背后的命令解释器仍然是cmd.exe
只不过中间由ntvdm.exe增加了一道设备虚拟层
天的白色影子

TOP

10# applba
对于cmd控制台对于%的处理
比你和7楼的理解还要复杂
举几个例子
cmd控制台下for的迭代变量是单个%而不是两个%
cmd控制台下执行echo %%OS% 将显示%OS=Windows_NT
cmd控制台下%var%引用的环境变量若不存在会原样显示而不是扩展为空
天的白色影子

TOP

cmd.exe对批处理中特殊字符的解释机制
上面两步中如果遇到了%,会中断并跳入%的解释,处理完毕后会返回,继续对其他特殊符号进行转义。
applba 发表于 2011-5-16 04:18

我也认为学习其实是一个不断反复打破和重新确定某些旧有概念和思维定势的过程
比如“预处理”的概念在解释特殊字符处理时确实过于笼统
但某些基本的原理应该是经得起考验的
比如特殊字符优先级的问题
%明显比其他特殊字符具有更高的优先级
也就是说cmd的转义字符检查不止一次
cmd第一次读入语句后首先要检查的符号就是%
它在检查完整条语句中所有的%后
才去重新检查语句中其它的字符
所以对于%这里不存在中断与返回的问题
天的白色影子

TOP

本帖最后由 plp626 于 2011-5-16 21:17 编辑

我的观点,大概啊。。。可以帮助新人理解


%既有高级语言反斜杠\的转义特性(仅脚本中对自身转义),又有引号的配对特性,还有遇到 : ~ 0123456789* 的扩展特性,

!则在变量延迟开启时,有引号配对特性,和遇到:的扩展特性,还有二次预处理特性。

^仅是反斜杠转义特性,(除了可以自身转义外,还可对!"以及 &|,()<>=;回车符还有某些特殊控制字符转义)

" 是配对特性,又有对后续字符串的转义特性。

预处理优先级顺序 % 大于 (" ^ &  < > | ) 大于 !
括号内的优先级同。

call会在当前行引发二次预处理。。。

关于括号,。。。 会引出很多问题,,越说越复杂。。

TOP

返回列表