说实话,我不希望这里有一个令人满意的答案。这个命令不能被调用,就是它(据我所知,只有那些不能用于调用的命令)。 以下是输出的几个例子:
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.
我有些怀疑,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.
所以至少解析完成了。
答案 0 :(得分:7)
你是对的。
FOR
,IF
和REM
不是正常的内部命令(但REM也存在正常的内部版本)。
他们使用自己的特殊解析器(每个都是不同的解析器)。
似乎这些命令被转换为某种令牌
因此,您会收到如此意外的错误消息(还有更多可能的字符),错误/令牌字符也取决于Windows版本(如果我记得正确的话)。
可能CALL
命令只能看到原始命令中的标记化数据。
命令块根本无法使用call命令,&|<>
也无法按预期工作。
call (a^|a)
搜索命令/令牌2
,因此如果您创建名为2.bat
的批处理文件,则可以使用call (a^|a)
启动它。
有关CALL
的更多信息
Dostips:CALL me, or better avoid call
Dostips:Limit CMD processing to internal commands, safer and faster?
答案 1 :(得分:4)
毕竟可以调用IF和FOR ..或几乎;
@echo off
rem :: this will produce an error
rem if a equ a
rem :: And this too
rem call if a equ a rem
rem :: But this will not!!!
call if a equ a
rem :: This will not too ((\but in command prompt single % is enough)
call for %%%%a in (.) do
rem :: And this
call if a equ a for %%%%a in (.) do if 1 equ 1 for %%%%a in (.) do if c==c
rem :: And this
call if a equ a for %%%%a in (.) do if 1 equ 1 for %%%%a in (.) do if c==c ( rem rem rem echo something
尽管我没有看到这个用法。
答案 2 :(得分:0)
这种方式有效: 如果调用了a == echo,请致电cmd.exe / c。