35# qzwqzw
我也这么认为,前面被那个比较有条理的说法吓倒了...仔细想想for和if确实是语块,比如: | @echo off&setlocal enabledelayedexpansion | | set "a b=." | | set "tmp=a b" | | echo for内: | | for %%a in ("a b") do if defined %%~a echo 存在“a b” | | ::正确 | | echo;&echo 不使用变量延迟: | | (if defined a b echo 存在“a b”) | | ::出错 | | echo;&echo 变量延迟: | | (if defined !tmp! echo 存在“a b”) | | ::正确 | | echo;&pauseCOPY |
我原来一直以为if defined是不支持空格变量名的,直到某天在某群里某个自以为是的家伙误打误撞写出来,我原以为会出错,结果一运行竟然没问题,这才发现原来if的条件语句是和整个语块一起进行划分的,也就是说,if不是一个语句,而是语块,for也是同样的情况,最有说服力的就是for循环中的for命令的开关、选项和参数是无法直接用变量修改的,这也证明了在语块划分完毕的时候,for语句的条件语句之前的部分也已经划分完了:for /f "tokens=!a!" ...COPY 众所周知这是会出错的
还有:
call if ...
call for ...
这两个都会出错,从错误提示来看,只能说明,for和if完全不是普通语句,而更可能是语块 |