[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
19楼的代码似是而非
又没有处理转义符号
不能作为for命令语法分析的参考

把cmd内部命令理解为函数未尝不可
但不要生硬套用函数模型来强解命令行分析

for和if不是关键字而是命令
官方文档提到的关键字
是for命令中的in、do、eol、skip、delims、tokens、usebackq
以及if命令中的not、exist、defined、errorlevel
诸如此类批处理命令中组成命令语法的固定字词
关键字本身不应该具有任何解析上的含义

关于预处理我倾向于这样定义
在批处理中开启echo on后语句所显示的形态即预处理的结果
这个过程cmd对所有语句是统一处理的
此后cmd对语句的语法分析会针对不同命令而有不同
比如各命令对于命令分隔符的处理牵扯到语法分析而各有差异
因此不应算作cmd预处理的范畴
天的白色影子

TOP

19楼的GCC代码中的词法分析
与cmd中各命令的词法分析大有不同
编译出的for.exe不等同于cmd的for命令
放在这里容易混淆读者的理解
与楼上贴出这段代码的立意相违背
所以我才刻意强调不要参考它来理解for命令的行为

转义字符^只有对于cmd的预处理才有意义
之后的内外部命令分析和执行时是看不到的
也就不具有任何转义的意义
天的白色影子

TOP

本帖最后由 qzwqzw 于 2011-5-26 22:28 编辑

同意36的的见解
当然某些措辞需要修改一下
“由于某些原因,在运行前的预处理时 没有能够分割参数”
应该说
cmd的预处理不会进行命令行的词法分析
因为它认为这是各命令自己的事情

另外for中其实最容易出问题的倒是usebackq
不仅会产生与正常理解相异的行为
而且可能还会泄露部分内存的数据
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>for /f "usebackq"  %f in ('df df') do ec
ho %f

C:\Documents and Settings\Administrator>echo df
df
系统找不到文件 。

C:\Documents and Settings\Administrator>for /f "usebackq"  %f in ('df df') do ec
ho %f

C:\Documents and Settings\Administrator>echo df
df

C:\Documents and Settings\Administrator>
天的白色影子

TOP

本帖最后由 qzwqzw 于 2011-5-26 22:49 编辑

for和if命令都要重建语句块
以插入到echo on的运行时序中

因此
如果说echo on的内容都是预处理得来的
那么可以说for和if参与了cmd的预处理
并把自己的语法分析过程也带到了预处理过程中
天的白色影子

TOP

返回列表