Bat批处理中start和call的区别
call是从批处理程序调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令);而start是启动一个单独的窗口运行指定的程序或命令。
call命令能够调用标签,与goto命令的区别是:采用
call :label
的形式(goto采用的形式是goto label
,没有冒号),并且采用call调用完标签之后,会继续顺序执行后续命令,而goto则是直接跳转至标签进行执行,并顺序执行标签后的内容;start不能够调用标签。调用范围不同:call主要用来进行批处理的内部调用,如
call :pend
和一些dos命令的调用如call set test=2
,但也可以调用其他可执行文件,而start则不能进行内部调用,但其可以执行基本上所有的外部程序,还可以执行shell,如打开文件夹start "" "%WINDIR%"
,安装网络打印机start "" "\\IP\Printer"
等等。调用方式不同:call是严格意义上而言的调用,在call另一个批处理时是在同一窗体进程里执行,而start则是执行,所以在执行另外一个批处理时是在不同的窗体进程里进行,也就是说在新开启的进程里执行,虽然start可以加入b参数,但其结果却完全不同。如我们使用
call set test=2
和start /b set test=2
看似执行的结果相同,但是我们发现后者有两个进程,而且在窗体里要执行两次exit才能退出,所以当我们使用start来执行一个批处理后最好在被调用的批处理中也加一个exit,否则无法退出被调用的批处理的dos窗体,但是使用call调用时如果在被调用的批处理中存在exit则会直接结束原始和被调用的批处理程序,这是一个非常严重的问题。建议在被调用的批处理中使用goto :eof
来取代exit。调用结果不同:call调用不仅可以把参数或变量传给被调用的批处理,而且被调用的批处理也可以设置参数或变量以便回传,而start只能把参数或变量传给被调用的批处理,却不能回传参数或变量,这一点实际上是第二点的延伸。
另外,我们还必须注意一点:使用call调用其他批处理时,在被调用的批处理中若我们使用goto命令的时候,建议要使用与原批处理中不同的标签名来跳转,否则可能会跳转到原批处理中而不能保证完整的执行被调用批处理中的所有语句。
批处理中的start和call命令具有不同的功能和用途。
start命令:
- 主要用于启动一个新的进程来执行指定的程序或命令。当使用start命令执行一个批处理时,会开启一个新的进程,这意味着原批处理和通过start启动的批处理是异步执行的。使用start命令执行批处理时,如果在被调用的批处理中没有正确地结束进程,可能会导致无法退出被调用的批处理的DOS窗体,需要执行两次exit才能关闭所有相关的进程。此外,start只能将参数或变量传递给被调用的批处理,但不能从被调用的批处理中回传参数或变量。
call命令:
- 用于在当前批处理中调用另一个批处理,并且可以在调用完成后继续执行原始批处理中的后续命令。使用call命令时,原批处理和被调用的批处理是同步执行的,即在被调用的批处理执行完毕后,才会继续执行原始批处理中的后续命令。与start不同,call不仅可以传递参数或变量给被调用的批处理,还允许被调用的批处理设置参数或变量以便回传给原始批处理。此外,当使用call命令时,如果在被调用的批处理中使用goto命令跳转,建议使用与原始批处理中不同的标签名,以避免跳转到原始批处理代码中,从而保证被调用批处理的完整执行。
综上所述,选择使用start还是call命令取决于你的具体需求。如果你需要启动一个新的进程来异步执行某个任务,并且不关心任务之间的交互或参数回传,那么可以使用start命令。如果你需要在当前批处理中同步调用另一个批处理,并且希望能够在调用后继续执行原始批处理的后续命令,或者需要传递和回传参数或变量,那么应该使用call命令
参考链接:https://www.jianshu.com/p/13070f48099a