[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
start是调用系统默认的打开方式执行一个文件,是在一个新的进程里面执行

TOP

从你的例子里面,你可以在b.bat最后加个pause
然后再执行a.bat,事实上都是可以的。。

TOP

main.bat
  1. @echo off
  2. set a=1
  3. pause
  4. echo call child.bat
  5. call child.bat
  6. echo end call
  7. pause
  8. echo %b%
  9. pause
复制代码

child.bat
  1. @echo off
  2. echo %a%
  3. set b=20
  4. pause
复制代码


注意,这个实验中,main.bat定义了变量a为1,在child.bat中定义了变量b为1
main.bat首先将call child.bat,然后child.bat将echo %a%,现在能正常显示1。call完之后,main.bat将echo %b%,也能正常显示20

如果将call改为start,待child.bat执行完再关闭之后,main.bat继续echo %b%,将无法显示变量b的值

call的时候,他们拥有同一个壳cmd.exe,在同一个进程当中,所以他们的变量是互通的

start的时候,他们拥有两个壳cmd.exe,但在不同的进程当中,而由于这是他们的壳都是cmd.exe,所以child.bat可以看成是main.bat的子进程,子进程可以读取父进程中的变量,但不能赋予父进程变量的值。而当start的程序不同的壳的时候,他们就不是父子进程关系。

我是这样理解的,有不同意见以砖拍之。。。
1

评分人数

    • pumahxh: 分析透彻,感谢分享!PB + 5

TOP

goto :eof在父批中是退出批处理,在call(或者说子批)是退出当前批,也就是退出call这一线程(CMD是单线程程序,执行完一个线程才能执行下一个线程),那么退出了这一个线程就回到了调用这一个线程的地方,继续执行。。。

正应为是线程,处在同一个进程和同一个壳中,变量可以共用。。。

TOP

返回列表