batch-file - 为什么在不将 “call”附加到该行的情况下调用嵌套批处理文件会退出父批处理文件?

标签 batch-file cmd

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

  • CALL
  • CALL(SS64)
  • Bat file termination

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

    对于一个不那么抽象的示例,假设我有一个批处理文件,将各个批处理文件“链接”在一起,并且我错误地没有在每行前面添加call:
    foo.bat
    bar.bat
    

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

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

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

    最佳答案

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

    在Microsoft放入call命令之前,没有办法返回到原始文件(没有使用一些技巧,例如将先前文件的名称作为参数,以及使用临时文件让原始批处理文件知道它已经圆顶了处理,然后可以GOTO文件的下一部分)。

    关于batch-file - 为什么在不将 “call”附加到该行的情况下调用嵌套批处理文件会退出父批处理文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638705/

    相关文章:

    java - 可执行文件在应该找到 64 位 Java 时却发现 32 位 Java

    windows - 使用批处理文件打开 Internet 选项,打开连接选项卡,按确定

    c++ - 当程序从 *.bat/*.cmd 文件或控制台运行时,如何让 ReadConsoleInput 通知 MOUSE_EVENT?

    linux - windows环境下的bash like管理

    python - 嵌套的 for 循环,设置变量和 if else 在批处理脚本中

    python - 如何将 smtp 调试信息记录到文件中?

    batch-file - 在另一个变量的 SET 语句中使用一个变量

    c# - 如何解决 "' installutil' 不是内部或外部命令,也不是可运行的程序或批处理文件。”?

    cmd - 如何使用cmd将加引号的环境变量写入文件?

    如果 Windows 安装在其他语言中,Windows CMD 如何绕过确认提示