|
|
发表于 2011-5-27 01:25:01
|
显示全部楼层
for、if应该的确是“关键字”而非一般命令,
预处理时就把参数传给它们了,从而它们也进行并影响预处理,而不是等cmd.exe先预处理完了再调用for。
zqz0012005 发表于 2011-5-26 20:50 
同意这个观点。
结合21楼的例子和结论:可见预处理时对for、if的“参数”有特殊对待,会先把非空格分隔符统一处替换成空格。而for、if引导的命令中的分号、逗号、等号等不改变。
如果不是有特殊对待(或者说for、if没有参与预处理),那为什么要把for、if参数部分中的非空格分隔符统一替换成空格?
23楼
例证:for^ /l %%i (1,1,5) echo %%i ,这里转义了第一个空格,结果运行提示
'for' 不是内部或外部命令,也不是可运行的程序或批处理文件。
把for换成其他命令,就不会报错。所以这个反而例证了for的特殊性。if类似。
7楼
我一直认为空格本身就不能通过^转义的;
为什么在for中就是例外?
可能真的就是例外。
对普通命令来说,就算预处理时空格确实被转义了,但普通命令是cmd在预处理后才调用它并把参数传给它,传递的还是实际空格,转义已经不存在了。
而对for不一样,参数是预处理时就传给它了,这时转义符是存在的,for也参与预处理,告诉cmd甚至是它自己决定怎么对待特殊字符。
比如那个for.exe,一个普通外部命令,cmd就是在预处理后才调用它并传参数,由于参数是空格隔开的,所以for.exe看到的参数是多个。
而for /f tokens^=1^,2^ delims^=^" %%a in ("a"b"c") do echo %%b,由于有转义符,for看到的option部分是只是一个参数[tokens=1,2 delims="] |
|