为什么不叫前面加上“呼”地行出父批处理文件嵌套的批处理文件?(Why does calling a

2019-06-26 12:32发布

我知道如何使用的父文件中嵌套调用批处理文件call命令,因为有很多对资源:

  • 呼叫
  • CALL (SS64)
  • bat文件终止

不过,我不明白为什么叫从另一个另一个批处理文件终止父。

对于一个不太抽象的例子,假设我有一个批处理文件,“链接”在一起的独立批处理文件,我错误地没有预先准备call给每一行:

foo.bat
bar.bat

这将只执行foo.bat,然后退出。 要正确地执行这两个命令,我会每个语句之前预先考虑调用:

call foo.bat
call bar.bat

为什么第一功能还存在吗? 为什么它没有被改变? 我注意到, call在MS-DOS 3.3问世了,它是在20世纪80年代后期发布的,所以这个功能还在这里反向兼容?

我想不出任何(实际)用途的,但也许我太习惯“新”的编程技术。

Answer 1:

DOS使用简单的文本处理(回来时,你有喜欢的东西FILES=20在CONFIG.SYS允许20个文件句柄),所以打开该文件,读取下一行,关闭该文件,然后执行刚读线。 如果该文件称为另一个,则处理继续与该文件,所以只有1文件句柄将需要一个批处理文件。

直到微软把在call命令,没有办法找回原来的文件(不使用的技巧,比如给一个文件名作为参数,并使用临时文件,让原来的批处理文件,知道它有圆顶一些处理,并且可以再GOTO该文件的下一部分)。



Answer 2:

肖恩柴郡写道,这是必要的向后兼容性。

但是,开始从一个批处理文件的批处理文件,而无需使用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 跳转到标签:myLabelsecond.bat



Answer 3:

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?