说实话,我不希望这里有一个令人满意的答案.这个命令不能被调用,就是这样(据我所知,只有那些不能用于调用的命令).以下是其输出的几个示例:
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)
所以至少解析完成了.
你太对了.
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处理限制为内部命令,更安全,更快捷?