使命令提示等待

时间:2014-10-30 05:47:18

标签: cmd batch-processing

@call JBOSSbuildWar.bat > ..\logs\JBOSSbuildWar_out 2> ..\logs\JBOSSbuildWar_err

start cmd /c @call WeblogicbuildWar.bat > ..\logs\WeblogicbuildWar_out 2> ..\logs\WeblogicbuildWar_err

start cmd /c @call FEBAPortletWebWar.bat > ..\logs\FEBAPortletWebWar_out 2> ..\logs\FEBAPortletWebWar_err

start cmd /c @call buildStaticJBoss.bat > ..\logs\JBOSSFEBAStaticWar_out 2> ..\logs\JBOSSFEBAStaticWar_err

我按顺序执行这组批处理文件。我想解决这个问题,以便它们并行执行。我已经使用start cmd / c完成了这项工作。现在,这将为每个人分配新的命令提示符窗口。假设在此之后有一些语句。我想确保只有在所有分叉批处理文件完成后才执行它们。怎么做到这一点?

让我们说每个文件的平均时间是: JBOSSbuildWar- 30分钟 WeblogicbuildWar- 35分钟 FEBAPortletWebWar- 30分钟 buildStaticJBoss- 35分钟

由于主命令提示符窗口已在30分钟内完成其任务,并且分叉的批处理文件需要另外5分钟才能完成,我希望主cmd等待其他人完成。请帮助。

3 个答案:

答案 0 :(得分:1)

简单方法:

在您的主要批次中,

del "%temp%\*.processfinished" >nul 2>nul
...
start ....whatever1.bat...
start ....whatever2.bat...
start ....whatever3.bat...
...
wait4all:
for /L %%a in (1,1,3) do if not exist "%temp%\%%a.processfinished" timeout /t 1 >nul &goto wait4all
:: continues here when all (3) processes have finished.
del "%temp%\*.processfinished" >nul 2>nul

然后在每个(3)辅助.bat文件中,创建一个文件"%temp%\x.processfinished",其中第一个进程x = 1,第二个进程为2,依此类推。

当子进程启动时,程序会等待,直到每个进程都创建了自己的“.processcompleted”文件,方法是检查是否有3个缺失,如果是,超时1秒再看一遍。只有3个文件存在才会继续。

最有可能的情况是,最好是辅助流程可以采用额外的参数(该子流程的“流程完成”文件的名称)而不是每个参数的固定数量。

您可以对此进行扩展,并使用日期和时间来增加文件名,以便整个过程本身可以并行运行多次。

BTW - 用

开始程序
@echo off

你可以删除所有领先的@(所有这些都会抑制该一个行的命令报告。)

此外,startstart "" .....更快乐,也就是说,引号中的空窗口标题作为其第一个参数。这允许其他参数在必要时被“引用” - 所使用的第一个“引用”参数被用作该过程的“窗口标题”,并且很可能丢失到子过程。定期分配一个虚拟(必要时为空)“窗口标题”意味着你将来不会绊倒这个问题。

答案 1 :(得分:1)

有多个命令,您可以选择要使用的命令,

暂停

在用户按任意键之前,将暂停cmd。 显示消息,"按任意键继续..." 我使用这个命令的某个变体叫做pause> nul。 它的作用是暂停.bat,但没有显示消息,你只是得到一个空白的屏幕!

TIMEOUT

多种语法,非常有用的命令,使用这个很多。 示例代码:TIMEOUT 10 可以通过按键旁路 暂停执行命令10秒。 你也可以像这样构造它:TIMEOUT 10 / nobreak 这不允许用户按键跳过它,他们必须忍受它!

<强>平

非常好。 语法是这样的:PING 1.1.1.1 -n 1 -w 60000&gt; NUL 可能是三者中最复杂的。 PING可用于延迟执行数秒。

希望我帮忙! -Logan

答案 2 :(得分:0)

您可以在每个命令之前添加此计时器功能:

@call JBOSSbuildWar.bat&gt; .. \ logs \ JBOSSbuildWar_out 2&gt; .. \ logs \ JBOSSbuildWar_err

超时/ t 60 / nobreak&gt; nul

启动cmd / c @call WeblogicbuildWar.bat&gt; .. \ logs \ WeblogicbuildWar_out 2&gt; .. \日志\ WeblogicbuildWar_err

超时/ t 60 / nobreak&gt; nul

启动cmd / c @call FEBAPortletWebWar.bat&gt; .. \ logs \ FEBAPortletWebWar_out 2&gt; .. \ logs \ FEBAPortletWebWar_err

超时/ t 60 / nobreak&gt; nul

启动cmd / c @call buildStaticJBoss.bat&gt; .. \ logs \ JBOSSFEBAStaticWar_out 2&gt; .. \日志\ JBOSSFEBAStaticWar_err

Ps:60代表1分钟,如果你想要30分钟,则将其改为1800