6

老实说,我不希望在这里得到令人满意的答案。这些命令不能被调用,仅此而已(据我所知,唯一不能与 call 一起使用的命令)。以下是他们输出的几个例子:

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.

所以至少解析完成了。

4

3 回答 3

8

你说的很对。

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

这些命令似乎被翻译成一种标记。
因此,您收到了这样的意外错误消息(有更多可能的字符),错误/令牌字符也取决于 Windows 版本(如果我记得正确的话)。
该命令可能CALL只看到原始命令中的标记化数据。

命令块根本无法与 call 命令一起使用,也&|<>无法按预期工作。

call (a^|a)

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

有关CALL
Dostips:CALL me 的更多信息,或者更好地避免调用
Dostips:Limit CMD 处理内部命令,更安全、更快捷?

于 2013-10-18T08:46:50.583 回答
4

毕竟可以调用 IF 和 FOR ..or 几乎;

    @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

尽管我看不到这个的用法。

于 2014-04-22T19:29:34.247 回答
1

这种方式有效:调用 cmd.exe /c 如果 a==a echo 调用。

于 2020-05-04T06:27:21.510 回答