一直对START和CALL的区别弄的不是很清楚,今天在修改我的绿软通用安装程序时对其才有了深刻的了解,根据个人的经验,现在总结如下:
一是调用范围不同:CALL主要用来进行批处理的内部调用如CALL:PEND和一些DOS命令的调用如CALL SET TEST=2,但也可以调用其他可执行文件,而START则不能进行内部调用,但其可以执行基本上所有的外部程序,还可以执行SHELL,如打开文件夹START "" "%WINDIR%",安装网络打印机START "" "\\IP\Printer",同时需要注意有无START调用外部程序的区别;
二是调用方式不同: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的时候建议使用不同的节来跳转,否则可能跳转到原批处理中而不能完整的执行被调用的批处理. |
|