为什么我不能在批处理或cmd中调用"IF"和"FOR"?

npo*_*aka 5 batch-file

说实话,我不希望这里有一个令人满意的答案.这个命令不能被调用,就是这样(据我所知,只有那些不能用于调用的命令).以下是其输出的几个示例:

C:\Windows\system32>call @if a==a echo called 
',' is not recognized as an internal or external command,
operable program or batch file.

C:\Windows\system32>call (@if a==a echo called)
';' is not recognized as an internal or external command,
operable program or batch file.

C:\Windows\system32>call if a==a echo called
'if' is not recognized as an internal or external command,
operable program or batch file.

C:\Windows\system32>call for  %a in (1) do @echo called
'for' is not recognized as an internal or external command,
operable program or batch file.

C:\Windows\system32>call @for  %a in (1) do @echo called
'+' is not recognized as an internal or external command,
operable program or batch file.

C:\Windows\system32>call (@for  %a in (1) do @echo called)
';' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

我有一些怀疑,IF和FOR实际上并不是"真正的"命令 - 他们只是决定将命令提示符控制传递给它们后面的行(或括号块),这会混淆调用.无论如何,当检测到FOR或IF时出现语法错误时:

C:\Windows\system32>call (@if a= echo called)
= was unexpected at this time.

C:\Windows\system32>call (for %a (1) do echo called)
(1 was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

所以至少解析完成了.

jeb*_*jeb 7

你太对了.

FOR,IF并且REM不是正常的内部命令(但对于REM也存在正常的内部版本).
他们使用自己的特殊解析器(每个都是不同的解析器).

似乎这些命令被转换为某种令牌.
因此,您有这样的意外错误消息(还有更多可能的字符),错误/令牌字符也取决于Windows版本(如果我记得在这里正确).
CALL命令可能只看到原始命令中的标记化数据.

命令块根本不能使用call命令,也&|<>不能按预期工作.

call (a^|a)
Run Code Online (Sandbox Code Playgroud)

搜索命令/令牌2,因此如果您创建一个名为的批处理文件2.bat,则可以使用它来启动它call (a^|a).

有关CALL
Dostips的更多信息:请致电我,或者更好地避免调用
Dostips:将CMD处理限制为内部命令,更安全,更快捷?