Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 用于环路开关处理_Windows_Batch File_Cmd - Fatal编程技术网

Windows 用于环路开关处理

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命令的开关没有空格,就像有空格一样工作

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的
相反,无法识别。谢谢