36

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

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

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

foo.bat
bar.bat

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

call foo.bat
call bar.bat

为什么第一个功能仍然存在?怎么还没改?我注意到它call是在 1980 年代后期发布的 MS-DOS 3.3 中引入的,那么这个功能是否仍然存在以实现反向兼容性?

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

4

3 回答 3

37

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

在微软输入call命令之前,没有办法恢复到原始文件(不使用诸如将前一个文件的名称作为参数,以及使用临时文件让原始批处理文件知道它已经完成一些处理的技巧,然后可以GOTO是文件的下一部分)。

于 2012-07-24T21:08:58.967 回答
8

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

但是不使用从批处理文件启动批处理文件CALL不会终止父级!
看起来是这样,因为在第二批退出后,父级通常不会进一步执行。
但是在启动 second.bat 之前使用调用将显示第一批未终止。

父.bat

echo parent.bat
call :myLabel
echo back in parent.bat main
exit /b

:myLabel
second.bat & echo back in parent.bat
exit /b

第二个.bat

echo second.bat
exit /b

我在这里使用secpond.bat & echo back ...来避免 cmd.exe 的另一个错误/功能。
如果您不使用second.bat任何附加功能,它将开始second.bat 跳转:myLabelsecond.bat!

于 2012-07-25T08:46:02.310 回答
0

Call基本上是说“去执行这个其他批处理文件,然后回到这里继续”。它从 DOS 3.3 左右就已经存在,如果现在将其删除,将破坏所有向后兼容性(这就是人们仍在使用批处理脚本的原因)。它也可以用于分支到:link位置。

有关使用和语法的信息(供其他人将来参考),您可以查看此MS TechNet 链接

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

于 2012-07-24T20:40:02.303 回答