为什么调用嵌套的批处理文件而不在行前面“调用”退出父批处理文件?

时间:2012-07-24 20:21:19

标签: batch-file cmd

我理解如何使用call命令从父文件中调用嵌套批处理文件,因为有大量资源:

但是,我不明白为什么从另一个批处理文件调用另一个批处理文件会终止父文件。

对于一个不那么抽象的例子,假设我有一个批处理文件,它将单独的批处理文件“链接”在一起,并且我错误地没有在每行前面添加call

foo.bat
bar.bat

这只会执行foo.bat然后退出。要正确执行这两个命令,我必须在每个语句之前添加调用:

call foo.bat
call bar.bat

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

我无法想到它的任何(实际)用法,但也许我已经习惯了“新的”编程技术。

3 个答案:

答案 0 :(得分:31)

DOS使用简单的文本处理(当你在config.sys中有FILES=20之类的东西时允许 20 文件句柄),所以打开文件,读取下一行,关闭文件,然后执行刚读取的行。如果文件名为another,则继续处理该文件,因此批处理文件只需要1个文件句柄。

在Microsoft输入call命令之前,没有办法回到原始文件(不使用将前一个文件的名称作为参数,并使用临时文件让原始文件的技巧批处理文件知道它有圆顶处理,然后可以GOTO文件的下一部分。

答案 1 :(得分:7)

正如Sean Cheshire写的那样,向后兼容是必要的。

但是,在不使用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的其他错误/功能 如果您使用second.bat而没有任何额外内容,则会second.bat 跳转到:myLabel中的标签second.bat

答案 2 :(得分:0)

Call基本上是说&#34;去执行这个其他批处理文件,然后回到这里继续&#34;。自从DOS 3.3以来一直存在,如果它现在被删除会破坏所有向后兼容性(这就是人们仍在使用批处理脚本的原因)。它还可以用于分支到:link个位置。

有关使用和语法的信息(供将来参考),您可以看到MS TechNet link

如果您需要新功能,请改用CMD脚本或PowerShell脚本。