2014-01-20 136 views
2

我很好奇为什么开关直接跟在set命令后面没有空格,工作方式与有空格相同;For循环开关处理

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 ...

我的问题是,为什么当它明确区分开关与命令的区别时,它是否接受语法,并且随后不起作用 - 此外,为什么它会产生上述错误?

+4

M $为'set','for','for/f','if'和'echo'构建了不同的解析器。所以你应该问上个世纪的M $学员。你可以在dostips.com上找到更多关于奇怪语言的信息 – Endoro

回答

2

大多数内部命令使用一致的解析器,他们通常接受commandName/option的形式。但是FOR和IF命令更复杂,并且有特殊的解析规则。事实上,FOR/L ...IF/I ...不起作用的一些证据表明,他们实际上有他们自己的特殊解析规则。 jeb对批解析器的工作方式做了大量的研究,但我从来没有看到他对FOR和IF如何工作的完整分析。

+0

谢谢。我明白,他们显然有特殊的分析规则 - 让我困惑的事情是,返回的错误似乎认识到命令和开关之间的分离。 – unclemeat

+0

错误似乎来自shell而不是解析器。这表明这不是解析器中的差异。例如,返回的错误与您输入'foo'作为命令相同。 – unclemeat

+0

我可能只是不理解解析器/ shell操作的一些基本原理。 – unclemeat

0

这两个命令的词法分析是不同的:一个需要切换,另一个不切换。

没有咨询执行windows批处理脚本语言的程序员,我们不能说这是为什么。

我认为可以公平地说,虽然从语言质量的角度来看,总的来说,我不会抱有太大希望得到理性的答案。

+3

'/ A'是SET的开关,而'/ L'不是FOR的开关? – dbenham