用于循环开关处理

时间:2014-01-20 01:52:38

标签: windows batch-file cmd

我很好奇为什么直接在没有空格的set命令之后切换,就像有空格一样工作;

set /a i+=1,与set/a i+=1的工作方式相同,甚至set/ai+=1

然而 - 相同的逻辑不适用于for命令 - 以下内容不起作用:

for/L %a in (1,1,2) do echo %a

然而它会产生错误:

'for' is not recognized as an internal or external command,
operable program or batch file.

而不是我期望的'for/L' is not recognized ...

我的问题是,当它明确区分开关与命令时,为什么它不接受语法,然后不能工作 - 此外,为什么它会产生上面看到的错误?

2 个答案:

答案 0 :(得分:2)

大多数内部命令使用一致的解析器,它们通常接受commandName/option形式。但是FOR和IF命令更复杂,并且具有特殊的解析规则。 FOR/L ...IF/I ...不起作用的事实是他们实际上有自己特殊解析规则的一些证据。 jeb已经对批处理解析器的工作原理做了很多研究,但我从未见过他对FOR和IF如何工作的完整分析。

答案 1 :(得分:0)

两个命令的词法解析是不同的:一个接受开关,另一个不接受。

如果没有咨询实现Windows批处理脚本语言的程序员,我们就不能说为什么会这样。

我认为可以公平地说,从一般语言的质量来看,我不会对理性答案抱太大希望。