从另一个或从提示符调用Windows批处理文件的几种方法。哪一种情况?


92

Windows批处理文件(called.batcalled.cmd)可以通过几种方式从另一个批处理文件(caller.batcaller.cmd)或交互式cmd.exe提示符下调用:

  1. 直接致电: called.bat
  2. 使用调用命令: call called.bat
  3. 使用cmd命令: cmd /c called.bat
  4. 使用启动命令: start called.bat

我很难根据他们的帮助文本来区分他们的预期用途:什么时候使用哪个?例如,为什么我可能会使用“通话”命令而不是直接通话。有什么不同?

我对一些摘要报告感兴趣,该摘要报告从不同角度分析了所有4种可能性(以及其他一些可能性,如果有的话):针对它们而设计的推荐用例,流程生成,执行上下文,环境,返回代码处理。

注意:我正在使用Windows XP SP3。

Answers:


101
  1. 批处理文件将由当前的cmd.exe实例(例如,如果在资源管理器中双击,则由新的cmd.exe实例)执行。

  2. 与#1相同,仅在在batch / cmd文件中使用时才有效。在没有“调用”的批处理文件中,父批处理文件结束并且控制权传递给被调用的批处理文件。用'call'运行子批处理文件,父批处理文件在调用后继续执行语句。

  3. 在新的cmd.exe实例中运行批处理文件。

  4. Start将在新窗口中的新cmd.exe实例中运行批处理文件,并且调用方将不等待完成。


7
请注意,对于选项4,开始命令应始终后跟一个'title',因此,如果您不需要标题,则应使用空双引号,例如start "" [options] command
Daryn

@Daryn该链接只是提到您应该始终拥有一个,但甚至说Microsoft将参数描述为可选参数。他们没有告诉我为什么应该“要求”它。他们的底部甚至有几个示例都省略了title参数。
亚当·普洛彻

5

有一件事不从这里的评论清楚:当你从另一个调用一个批处理文件只用它的名字(案例#1中的原题),执行停止从调用批处理文件。例如,在这些行中:

called.bat
echo Hello

'echo Hello'行(及其后的所有内容)将不会被调用。如果您使用'call'关键字,则在调用之后恢复执行。因此,在这种情况下:

call called.bat
echo Hello

“ echo Hello”行将被调用。

另外,被调用.bat文件中设置的所有变量也将被传递回调用过程。

假设有一个名为“ .bat”的文件,其内容如下:

set MYVAR=hello

然后,如果使用%MYVAR%,则它可用于调用批处理文件:

call called.bat

但是,它不会使用

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.