问题现象
在批处理里写循环,第一反应往往是拼goto加计数器,或者干脆放弃、改用外部脚本。即便知道有for /l,也容易在细节上翻车。
现象一:在命令行里写好使的for /l %x in (1, 1, 5) do echo %x,原样复制进.bat文件后双击运行,直接报「此时不应有 %x」,一条都没执行。
现象二:想打印 1 到 100,写成了for /l %x in (1, 100) do ...,循环要么不执行,要么只跑一轮,参数个数不对时解析器给出的提示毫不直观。
现象三:循环体里想执行多条命令,直接把第二行换行写,结果只有第一行被当作循环体,其余命令在循环结束后只执行一次,逻辑完全错乱。
现象四:循环变量用了%%x,但在if或嵌套结构里引用时取不到值,或者取到的是上一次迭代的残留值。
现象五:需要用递减循环(从 100 数到 1)或者步长为 2 的循环,不知道for /l支持负数步长,转而手写计数器,代码冗长且容易出错。
原因分析
批处理对%的处理是分层的:在命令行交互环境里,变量名写作%x;在批处理文件里,必须转义成%%x。原因是批处理解析器在读取文件时会先做一遍百分号剥离,如果只写%x,这