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

Amo*_*tha 6 batch-file

我有一个.bat文件,我可以传递参数.

LOAD_TABLE_WRAPPER.BAT Table1 DEV
Run Code Online (Sandbox Code Playgroud)

简而言之,它运行SQL以在Dev环境中加载Ta​​ble1.现在,我希望它能在一夜之间加载多个表.所以,我建立了一个大师.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
Run Code Online (Sandbox Code Playgroud)

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

:eof
exit %ERROR_STATUS%
Run Code Online (Sandbox Code Playgroud)

dbe*_*ham 5

您exit %error_status%在LOAD_TABLE_WRAPPER.BAT中的命令正在终止批处理会话,因此您的MASTER_LOAD.BAT永远不会有机会在下次调用时继续.

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

exit /b %error_stats%
Run Code Online (Sandbox Code Playgroud)

我几乎从不在批处理文件中使用没有/ 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
Run Code Online (Sandbox Code Playgroud)

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

用EXIT/B打电话

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

CMD/C.

  • 相对缓慢
  • 返回时无法保留环境变量值.(您可以将定义写出来并在返回主文件时将其加载回来,但这不方便或有效)
  • 被调用的脚本始终以默认的延迟扩展和扩展状态启动(通常延迟扩展被禁用并且扩展已启用)

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


qba*_*ler 0

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

"START program-name arg1 arg2"`
Run Code Online (Sandbox Code Playgroud)