【问题标题】:Calling a .BAT file from another .bat file从另一个 .bat 文件调用 .BAT 文件
【发布时间】:2012-08-03 16:49:31
【问题描述】:

我有一个可以向其传递参数的 .bat 文件。

LOAD_TABLE_WRAPPER.BAT Table1 DEV

简而言之,它运行 SQL 以在 Dev 环境中加载 Table1。现在,我希望它在一夜之间加载多个表。所以,我设置了一个主 .BAT,类似于

::MASTER_LOAD.BAT
CALL LOAD_TABLE_WRAPPER.BAT Table1 Dev
CALL LOAD_TABLE_WRAPPER.BAT Table2 Dev
CALL LOAD_TABLE_WRAPPER.BAT Table3 Dev

如果我从 cmd 提交 MASTER_LOAD.BAT,它会执行表 1 的加载,但不会继续加载表 2。这是 WRAPPER.BAT 的最后两行

:eof
exit %ERROR_STATUS%

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    您在 LOAD_TABLE_WRAPPER.BAT 中的 exit %error_status% 命令正在终止您的批处理会话,因此您的 MASTER_LOAD.BAT 永远没有机会在下一次调用中恢复。

    您可以通过在 EXIT 命令中添加 /B 选项来解决问题

    exit /b %error_stats%
    

    我几乎从不在批处理文件中使用没有 /B 的 EXIT(尽管有时不需要 /B)。

    但另一种选择是通过 CMD 而不是 CALL 运行被调用的脚本。

    ::MASTER_LOAD.BAT
    CMD /C LOAD_TABLE_WRAPPER.BAT Table1 Dev
    CMD /C LOAD_TABLE_WRAPPER.BAT Table2 Dev
    CMD /C LOAD_TABLE_WRAPPER.BAT Table3 Dev
    

    这些方法之间存在许多差异

    使用 EXIT /B 调用

    • 比较快
    • 可以在返回时保留环境变量值(如果您不想保留值,可以使用 SETLOCAL)
    • 被调用脚本继承延迟扩展和扩展状态(启用或禁用)

    CMD /C

    • 比较慢
    • 无法在返回时保留环境变量值。 (您可以将定义写到一个文件中,然后在返回到主服务器时将它们重新加载,但这既不方便也不高效)
    • 被调用的脚本总是以默认的延迟扩展和扩展状态开始(通常延迟扩展被禁用而扩展被启用)

    我绝不建议在 CALL 上使用 CMD /C,除非被调用的批处理文件在没有 /B 选项的情况下退出,并且您无法修改批处理文件以添加 /B 选项。

    【讨论】:

      【解决方案2】:

      执行 CALL LOAD_TABLE_WRAPPER.BAT Table1 Dev 有问题吗?在通话之间回显的结果是什么?

      【讨论】:

        【解决方案3】:

        您应该使用启动命令来解决这个问题。调用使当前进程运行命令。可以详细了解starthere.基本实现应该是:

        "START program-name arg1 arg2"`
        

        【讨论】:

          【解决方案4】:

          尝试发出 PAUSE 命令,如下所示:

          CALL LOAD_TABLE_WRAPPER.BAT Table1 Dev PAUSE CALL LOAD_TABLE_WRAPPER.BAT Table2 Dev PAUSE CALL LOAD_TABLE_WRAPPER.BAT Table3 Dev

          【讨论】:

            猜你喜欢
            • 2023-04-10
            • 1970-01-01
            • 2010-10-13
            • 1970-01-01
            • 2021-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-09
            相关资源
            最近更新 更多