【问题标题】:How do I launch multiple batch files from one batch file with dependency?如何从一个具有依赖关系的批处理文件启动多个批处理文件?
【发布时间】:2012-12-21 17:02:22
【问题描述】:

我想运行一个批处理文件,启动其他批处理文件。我查看了此处发布的类似问题:How to run multiple .BAT files within a .BAT file

我遵循了这个例子(特别是最后一个建议)并且它工作了......部分。它确实启动了我需要的批处理文件。但是,为了使应用程序正常运行,必须打开其中一些批处理文件,然后运行它们的程序几秒钟,然后再启动下一个批处理文件,否则它们将不会被注册。具体来说,第一个批处理文件启动一个 Web 应用程序服务器 (JBOSS 5.1),然后下一个批处理文件打开一个池管理器,然后其他两个启动分发服务器。当我运行调用其他批处理文件时,它们几乎同时启动,并且它们不相互注册。我什至可以用批处理文件来做到这一点吗?还是我必须进入其他批处理文件的代码并在那里进行更改?我想不惜一切代价避免这种情况。

这是我目前所拥有的:

start cmd /k CALL D:\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GA\bin\run.bat

start cmd /k CALL batch1.bat

start cmd /k CALL batch2.bat

start cmd /k CALL batch3.bat

【问题讨论】:

标签: batch-file


【解决方案1】:

您可以删除start cmd /k,直接使用CALL

CALL D:\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GA\bin\run.bat
CALL batch1.bat
CALL batch2.bat
CALL batch3.bat

【讨论】:

  • 那么start cmd /k 有什么目的呢?
  • START CMD /K 启动一个新的CMD 进程,运行批处理文件然后退出。至少它是不必要的,并且如果您的批处理文件交互可能会导致您出现问题,即batch1.bat 设置batch2.bat 使用的变量等。
【解决方案2】:

答案:

/wait 选项添加到启动命令。

WAIT        Start application and wait for it to terminate.

示例:

start /wait cmd /k CALL D:\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GA\bin\run.bat

start /wait cmd /k CALL batch1.bat

start /wait cmd /k CALL batch2.bat

start /wait cmd /k CALL batch3.bat

否则,只需在启动之间使用 ping 延迟。 (见 user706837 的回答)

参考资料:

TechnetRobSS64DosTips

【讨论】:

  • 我很抱歉让您觉得自己很幼稚,但请记住,我对编程非常陌生。我最关心最后两个命令,我尝试使用“WAIT”,但我不确定我是否正确执行。我尝试的方法不起作用:第 1 行:启动 cmd /k CALL batch2.bat 第 2 行:等待启动 cmd /k batch3.bat。我必须使用反斜杠吗?我在哪里放置“等待”。在行的开头?开始后?
  • @DavidHorvath 我已经更新了我的答案以展示一些示例。也欢迎学习Batch。这很有趣,也很头疼。学习批处理的第一条规则是经常使用帮助/? 选项。因此,要了解您正在使用的每个命令,请在命令提示符处输入 start /?call /?cmd /?。或访问 microsoft technet 页面。 technet.microsoft.com/en-us/library/cc772390(v=ws.10).aspx
  • 非常感谢。我尝试了 ping 延迟,它正在工作。显然这有点粗糙,因为我不知道确切的时间,所以我只是在玩不同的延迟,直到我得到最好的序列。
  • 我也刚刚尝试过 start /wait...而且效果更好。再次感谢您的所有帮助。我还为那个 microsoft technet 页面添加了书签。我有一种感觉,我会广泛引用它。
【解决方案3】:

每当我有依赖于另一个的批处理文件时,我要么: 1. 嵌套它们;意思是,如果batch1 需要在batch2 之前运行,那么我在batch1 中添加batch2。 2. 在 batch2 中打一个“睡眠”电话。这只有在您相当确定 batch1 的启动持续时间时才有可能。

一个示例睡眠命令是:

ping 127.0.0.1 -n 4 > null

这将使批处理文件等待 3 秒。 (因为在 4 个回声之间只有 3、1 秒的睡眠)

例子:

start cmd /k CALL D:\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GA\bin\run.bat
ping 127.0.0.1 -n 4 > null
start cmd /k CALL batch1.bat
ping 127.0.0.1 -n 4 > null
start cmd /k CALL batch2.bat
ping 127.0.0.1 -n 4 > null
start cmd /k CALL batch3.bat

【讨论】:

  • 我正在使用的这些批处理文件是我安装的软件附带的,所以如果嵌套涉及编辑这些批处理文件,我会犹豫不决,以防我搞砸了。我想我可以创建一个备份文件。我对“ping 127.0.0.1 -n 4 > null”这一行感到困惑。我将 127.0.0.1 识别为环回地址,但我是否将它放在我的启动命令之间?如第 1 行:start cmd /k CALL batch2.bat 第 2 行:ping 127.0.0.1 -n 4 > null 第 3 行:start cmd /k CALL batch2.bat。
  • 谢谢,我试过了,效果很好。感谢您的帮助。
【解决方案4】:
There are multiple ways for that.

1.

rem echo call A

CALL a.bat

rem echo call B

CALL b.bat

rem echo call C

CALL c.bat

rem pause

--------------------

2.

echo call A

start cmd /k CALL a.bat


echo call B

start cmd /k CALL b.bat

echo call C

start cmd /k CALL c.bat

pause

---------------------

Here the difference is-

start cmd /k

   It creates these many instances. So we can see multiple number of CMD prompts.


CALL

   Each descendent CALL waits for the completion of the previous CALL.

【讨论】:

  • 上述答案中存在缩进问题。
  • 如果有缩进问题,请修复它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2013-08-12
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多