main.bat
| @echo off | | set a=1 | | pause | | echo call child.bat | | call child.bat | | echo end call | | pause | | echo %b% | | pauseCOPY |
child.bat
| @echo off | | echo %a% | | set b=20 | | pauseCOPY |
注意,这个实验中,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的程序不同的壳的时候,他们就不是父子进程关系。
我是这样理解的,有不同意见以砖拍之。。。 |