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

Bra*_*mos 31 cmd batch-file

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

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

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

foo.bat
bar.bat
Run Code Online (Sandbox Code Playgroud)

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

call foo.bat
call bar.bat
Run Code Online (Sandbox Code Playgroud)

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

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

Sea*_*anC 33

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

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

  • 对.向后兼容性允许许多win 3.0程序仍然在win 7上运行.那时候,我最终在汇编程序中编写了一些函数,这样它就可以成为一个程序并且可以回到批处理文件 - 现在是什么选择`,我使用一个简单的程序实现,该程序将错误级别设置为按下的字符的ASCII值. (5认同)

jeb*_*jeb 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
Run Code Online (Sandbox Code Playgroud)

second.bat

echo second.bat
exit /b
Run Code Online (Sandbox Code Playgroud)

我在这里使用secpond.bat & echo back ...以避免cmd.exe的另一个错误/功能.
如果使用second.bat不带任何额外它会开始second.bat 跳转到标签:myLabelsecond.bat!