我知道如何使用的父文件中嵌套调用批处理文件call
命令,因为有很多对资源:
不过,我不明白为什么叫从另一个另一个批处理文件终止父。
对于一个不太抽象的例子,假设我有一个批处理文件,“链接”在一起的独立批处理文件,我错误地没有预先准备call
给每一行:
foo.bat
bar.bat
这将只执行foo.bat,然后退出。 要正确地执行这两个命令,我会每个语句之前预先考虑调用:
call foo.bat
call bar.bat
为什么第一功能还存在吗? 为什么它没有被改变? 我注意到, call
在MS-DOS 3.3问世了,它是在20世纪80年代后期发布的,所以这个功能还在这里反向兼容?
我想不出任何(实际)用途的,但也许我太习惯“新”的编程技术。
DOS使用简单的文本处理(回来时,你有喜欢的东西FILES=20
在CONFIG.SYS允许20个文件句柄),所以打开该文件,读取下一行,关闭该文件,然后执行刚读线。 如果该文件称为另一个,则处理继续与该文件,所以只有1文件句柄将需要一个批处理文件。
直到微软把在call
命令,没有办法找回原来的文件(不使用的技巧,比如给一个文件名作为参数,并使用临时文件,让原来的批处理文件,知道它有圆顶一些处理,并且可以再GOTO
该文件的下一部分)。
肖恩柴郡写道,这是必要的向后兼容性。
但是,开始从一个批处理文件的批处理文件,而无需使用CALL
不终止父!
它看起来是这样,因为父母通常不会进一步第二批退出后执行。
但是用在开始之前second.bat调用,将显示,第一批没有结束。
parent.bat
echo parent.bat
call :myLabel
echo back in parent.bat main
exit /b
:myLabel
second.bat & echo back in parent.bat
exit /b
second.bat
echo second.bat
exit /b
我在这里使用的secpond.bat & echo back ...
避免CMD.EXE的另一个bug /功能。
如果你使用second.bat
没有任何额外它将开始second.bat
并跳转到标签:myLabel
在second.bat
!
Call
基本上是说“去执行这个其他的批处理文件,然后回到这里,继续”。 它一直在那里,因为DOS 3.3左右,如果它现在将删除打破了所有的向后兼容性(这就是为什么人们仍然使用批处理脚本)。 它也可以用来跳转到:link
的位置。
有关使用和语法(对于其他备查)的信息,你可以看到这个MS的TechNet链接
如果您需要新的功能,使用CMD脚本或PowerShell脚本来代替。
文章来源: Why does calling a nested batch file without prepending “call” to the line exit the parent batch file?