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

时间:2013-10-18 08:38:16

标签: 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.

我有些怀疑,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.

所以至少解析完成了。

3 个答案:

答案 0 :(得分:7)

你是对的。

FORIFREM不是正常的内部命令(但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。