Windows 用于环路开关处理
我很好奇为什么直接跟随set命令的开关没有空格,就像有空格一样工作Windows 用于环路开关处理,windows,batch-file,cmd,Windows,Batch File,Cmd,我很好奇为什么直接跟随set命令的开关没有空格,就像有空格一样工作 set/ai+=1,其工作原理与set/ai+=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. 与我期望的不同,“fo
set/ai+=1
,其工作原理与set/ai+=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”未被识别…
我的问题是,当它清楚地将switch与命令区分开来时,为什么它不接受语法,随后就不起作用了?此外,为什么它会产生上述错误?两个命令的词法分析是不同的:一个接受switch,另一个不接受 如果没有咨询实现windows批处理脚本语言的程序员,我们无法解释为什么会这样
我认为可以公平地说,从语言的总体质量来看,我对合理的答案不抱太大希望。大多数内部命令使用一致的解析器,它们通常接受
commandName/option
的形式。但是FOR和IF命令更复杂,并且有特殊的解析规则。事实上,FOR/L…
和IF/I…
不起作用,这部分证据表明它们实际上有自己的特殊解析规则。jeb对批处理解析器的工作方式做了很多研究,但我从未见过他对FOR和IF工作方式的完整分析。M$为set
、FOR
、FOR/f
、IF
和echo
构建了不同的解析器。所以你应该问问上个世纪的M$学员。你可以在dostips.com上找到更多关于这种奇怪语言的信息。/A
是SET的开关,而/L
不是SET的开关?谢谢。我知道它们显然有特殊的解析规则——但让我困惑的是,返回的错误似乎识别了命令和开关之间的分离。错误似乎来自shell,而不是解析器。这表明这与解析器中的差异无关。例如,返回的错误与作为命令输入foo
的错误相同。我可能只是不理解解析器/shell操作的一些基本原理。@unclesmeat-shell和内部命令是同一个。设置,用于,如果,回显。。。CMD.EXE外壳中还内置了更多功能,这是有道理的。仍然很奇怪的是,返回的错误表明,for
与/L的相反,无法识别。谢谢