Batch file 为什么CALL命令不能执行用括号括起来的命令?

Batch file 为什么CALL命令不能执行用括号括起来的命令?,batch-file,cmd,Batch File,Cmd,命令提示符和.bat文件中的行为都是相同的 @echo off :: the echo that will never be call(echo echo echo) :: its the same with non-cmd internal commands call ( notepad.exe ) :: and even with a code that should fail call(gibberish) :: moreover the execution is successf

命令提示符和.bat文件中的行为都是相同的

@echo off

:: the echo that will never be
call(echo echo echo)

:: its the same with non-cmd internal commands
call ( notepad.exe )

:: and even with a code that should fail
call(gibberish)

:: moreover the execution is successful
call (gibberish)&&echo %errorlevel%

:: though there's some parsing done
call(this will print call help because contains "/?"-/?)

:: and will detect a wrong syntax of some parsed-before-execution commands
call ( if a==)

:: and this too
call (%~)

:: same with labels
call(:label)
call(:no_label)
:label
:

使用多个命令和条件处理符号-command1和command2用于分组或嵌套多个命令

-因此,只要不使用重定向符号,就没有任何东西表明语法是非法的


调用解析器中的更多错误-

在命令提示符窗口cmd.exe/中输入?并查看最后显示页面上属于文件完成的最后一段:

The special characters that require quotes are:  
     <space>  
     &()[]{}^=;!'+,`~
这当然会导致错误消息,因为Windows找不到名为Notepad.exe的可执行文件来调用

一小时前,我从cmd.exe的一条有趣评论中了解到,cmd.exe解析的行与所有其他应用程序不同


由于有权访问cmd.exe源代码的程序员很可能永远不会读到这个问题,因此我们永远不会得到这些示例命令被解释为我们在执行它们时可以看到的原因的答案。

在命令提示符窗口cmd.exe/中输入命令?并查看最后显示页面上属于文件完成的最后一段:

The special characters that require quotes are:  
     <space>  
     &()[]{}^=;!'+,`~
这当然会导致错误消息,因为Windows找不到名为Notepad.exe的可执行文件来调用

一小时前,我从cmd.exe的一条有趣评论中了解到,cmd.exe解析的行与所有其他应用程序不同


由于有权访问cmd.exe源代码的程序员很可能永远不会读到这个问题,因此我们永远不会得到解释这些示例命令的答案。

我认为唯一将括号解释为表达式分隔符的命令是for、IF和SET/a

添加新行可能看起来很有希望:

Call (
 Echo Hello
)
但是如果你试着跑步

Call (
这实际上是在尝试运行命令.cmd 如果您尝试创建一个名为.cmd的批处理文件,那么实际上您可以使用

Call "("
引号是必需的,因为是“特殊”字符

在PowerShell中,如果在CMD和PowerShell之间切换,括号可用于更多可能会造成混淆的地方

(2+3)

将在PowerShell中返回5,但在CMD中只给出一个错误。

我认为唯一将括号解释为表达式分隔符的命令是for、IF和SET/A

添加新行可能看起来很有希望:

Call (
 Echo Hello
)
但是如果你试着跑步

Call (
这实际上是在尝试运行命令.cmd 如果您尝试创建一个名为.cmd的批处理文件,那么实际上您可以使用

Call "("
引号是必需的,因为是“特殊”字符

在PowerShell中,如果在CMD和PowerShell之间切换,括号可用于更多可能会造成混淆的地方

(2+3)

将在PowerShell中返回5,但仅在CMD中给出一个错误。

可能是因为这不是CALL语句规范的一部分。因为它是CALL的无效语法。@KenWhite语法是如何无效的?-这是call help页面,没有提到括号:关于cmd.exe的规范很少,而且它们不是很精确,或者只是错误。调用和打开的括号是连接调用有关系吗?可能的语法错误?可能更改为call,可能是因为这不是call语句规范的一部分。因为它是call的无效语法。@KenWhite语法是如何无效的?-这是call help页面,没有提到括号:关于cmd.exe的规范很少,而且它们不是很精确,或者只是错误。调用和打开的括号是连接调用有关系吗?可能的语法错误?调用引用的cmd摘录的可能更改实际上与文件完成有关,此处讨论:。这是调用解析器中的一个相当大的错误——这里有更多调用行为不雅的情况——在命令提示符窗口中输入cmd.exe只会调用另一个cmd会话。您的意思是cmd.exe/??引用的cmd摘录实际上涉及文件完成,此处讨论:。这是调用解析器中的一个相当大的错误——这里有更多调用行为不雅的情况——在命令提示符窗口中输入cmd.exe只会调用另一个cmd会话。您的意思是cmd.exe/??左括号也是表达式分隔符,甚至可以将管道/条件执行->回送a和回送b|更多内容合并在一起。我认为调用会将它们识别为表达式分隔符,但这只是一个错误。左括号也是表达式分隔符,甚至可以将管道/条件执行->echo a&echo b | more联合起来。我认为调用会将它们识别为表达式分隔符,但这只是一个错误。