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

dim*_*dim 90 windows shell batch-file

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

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

我很难根据他们的帮助文本区分他们的预期用法:何时使用哪一个?例如,为什么我可以使用'call'命令而不是直接调用.有什么不同?

我对一些摘要报告很感兴趣,这些摘要报告从各种观点分析了所有4种可能性(以及其他可能缺失的可能性):它们被设计为适合的推荐用例,处理产生,执行上下文,环境,返回代码处理.

注意:我使用的是Windows XP SP3.

Kyl*_*ons 97

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

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

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

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

  • 注意选项4,启动命令[应始终后跟'标题'](http://ss64.com/nt/start.html),所以如果你不需要标题,你应该有空双引号,例如`start""[options] command` (7认同)

小智 5

从这里的评论中不清楚的一件事是:当您仅使用其名称(原始问题中的案例#1)从另一个批处理文件调用一个批处理文件时,执行将从调用批处理文件停止。例如,在这些行中:

called.bat
echo Hello
Run Code Online (Sandbox Code Playgroud)

'echo Hello' 行(及其后的任何内容)将不会被调用。如果您使用“call”关键字,则在调用后继续执行。所以在这种情况下:

call called.bat
echo Hello
Run Code Online (Sandbox Code Playgroud)

'echo Hello' 行将被调用。

此外,在调用的.bat 文件中设置的所有变量也将传递回调用进程。

想象一个有这一行的“被调用的.bat”文件:

set MYVAR=hello
Run Code Online (Sandbox Code Playgroud)

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

call called.bat
Run Code Online (Sandbox Code Playgroud)

但是,它不会使用

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

REM stops and replaces current cmd.exe process with a new one
called.bat        
Run Code Online (Sandbox Code Playgroud)