从另一个 .bat 文件调用 .BAT 文件

7
我有一个 .bat 文件,可以向其中传递参数。
LOAD_TABLE_WRAPPER.BAT Table1 DEV

简单来说,它运行一个SQL在开发环境上加载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个回答

6

在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

这两种方法之间有一些区别

CALL with EXIT /B

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

CMD /C

  • 相对较慢
  • 无法在返回时保留环境变量的值。(您可以将定义写入文件并在返回到主机时重新加载,但这不方便也不高效)
  • 被调用脚本始终以默认的延迟扩展和扩展状态启动(通常禁用延迟扩展并启用扩展)

除非被调用的批处理文件没有EXIT /B选项且您无法修改批处理文件以添加/B选项,否则我永远不会建议使用CMD /C。


0

你应该使用start命令来解决这个问题。Call命令使当前进程运行命令。你可以在这里了解更多关于start的信息。基本实现应该是:

"START program-name arg1 arg2"`

0

执行 CALL LOAD_TABLE_WRAPPER.BAT Table1 Dev 时是否出现问题?在调用之间回显的结果是什么?


-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接