7

我有一个可以向其传递参数的 .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,它会执行 Table1 的加载,但不会继续加载 Table2。这些是 WRAPPER.BAT 的最后两行

:eof
exit %ERROR_STATUS%
4

4 回答 4

6

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

只需将 /B 选项添加到 EXIT 命令即可解决问题

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)
  • 被调用脚本继承延迟扩展和扩展状态(启用或禁用)

指令/C

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

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

于 2012-08-03T17:32:22.827 回答
0

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

于 2012-08-03T16:59:13.963 回答
0

您应该使用 start 命令来解决此问题。调用使当前进程运行命令。您可以在此处了解有关开始的更多信息基本实现应该是:

"START program-name arg1 arg2"`
于 2012-08-03T16:55:35.513 回答
-1

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

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

于 2013-07-18T03:41:06.313 回答