START和CALL命令在调用外部程序时的区别[原创+有实例]

 

源:http://hi.baidu.com/zhenhong/item/9e12e3455cb73cea1f19bcf7

近期有用到CALL和START,有一些心得体会,现拿出来跟大家分享(注:在此只讨论它们在调用外部程序时的区别).大家先看两个例子:

例1: @Echo Off rem 下面语句关掉桌面 taskkill /f /im explorer.exe>nul :aa rem 如果输入为y则重新显示桌面并退出 set /p choice=是否显示桌面[y/n] if /i %choice% equ y ( call explorer.exe exit ) goto aa

例2: @Echo Off rem 下面语句关掉桌面 taskkill /f /im explorer.exe>nul :aa rem 如果输入为y则重新显示桌面并退出 set /p choice=是否显示桌面[y/n] if /i %choice% equ y ( start explorer.exe exit ) goto aa

     大家可以看到,例1与例2完全相同,只是在调用explorer.exe时,例1用call而例2是用start.运行后(复制代码到文本文件,改后缀名为.bat,双击运行),可以看到它们得到得结果是不同得.在例1中,当输入y时,随能成功调出explorer.exe,但cmd窗口却不会关闭.而例2中,则是调出了explorer.exe且cmd窗口也关闭了(这是我们想看到得).在这就有疑问了,在例1中也有exit呀,怎么cmd窗口不会关闭能?笔者左思右想,觉得唯一合理得解释就是例1的程序根本就没执行到exit,也许有人要问,那程序现在在执行什么呢?笔者猜测程序是被困在explorer中了,为了验证此想法,笔者打开任务管理器,结束explorer.exe.果然cmd窗口随之关闭.

为了更简单的验证,笔者写出例3,例4. 例3: @Echo Off :e set /p choice=是否调出任务管理器[y/n] if /i %choice% equ y ( call taskmgr.exe exit ) goto e

例4: @Echo Off :e set /p choice=是否调出任务管理器[y/n] if /i %choice% equ y ( start taskmgr.exe exit ) goto e

     运行例3,输入y,成功调出任务管理器,但cmd窗口不会关闭,这时关掉任务管理器,cmd窗口随之关闭.而例4则是cmd窗口直接关闭.

     总结一下,当用call调用外部程序时,外部程序跟主程序还是一个整体(注,可以有多个进程,如例1中就有cmd.exe和explorer.exe),这时可以吧外部程序看成主程序的一个子程序,它们顺序执行.而当用start调用外部程序时,外部程序跟主程序则成为两个单独的程序,他们单独执行(怎么执行就看操作系统怎么调度了,哈哈).

     另外还有一点是,当在例1与例3中,删除掉call命令时,程序依然照常执行,效果跟有call时一样,由此推测,在不写call与start,只用程序名调用程序时,效果等同于使用call.即可以这样理解,在既没有call有没有start时,程序会自动添加call.

posted @ 2014-03-03 12:17  roilat  阅读(1256)  评论(0)    收藏  举报