2014-10-30 69 views
0
@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 

我有这套批处理文件按顺序执行。我想分出这个,以便它们并行执行。我已经使用启动cmd/c完成了。现在这将为它们中的每一个分出新的命令提示符窗口。假设在此之后有一些陈述。我想确保它们在所有分支批处理文件完成后才能执行。如何实现这一目标?作出命令提示等待

比方说由每个文件中取出的平均时间为: JBOSSbuildWar-30分钟 WeblogicbuildWar-35分钟 FEBAPortletWebWar-30分钟 buildStaticJBoss-35分钟

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

回答

0

可以每个命令之前添加该定时器功能:

@call JBOSSbuildWar.bat> .. \日志\ JBOSSbuildWar_out 2> .. \日志\ JBOSSbuildWar_err

超时/吨60/NOBREAK > NUL

开始CMD/C @call WeblogicbuildWar.bat> .. \日志\ WeblogicbuildWar_out 2> .. \日志\ WeblogicbuildWar_err

超时/吨60/NOBREAK> NUL

开始CMD/C @call FEBAPortletWebWar.bat> .. \日志\ FEBAPortletWebWar_out 2> .. \日志\ FEBAPortletWebWar_err

超时/吨60/NOBREAK> NUL

开始CMD/C @call buildStaticJBoss。蝙蝠> .. \日志\ JBOSSFEBAStaticWar_out 2> .. \登录\ JBOSSFEBAStaticWar_err

PS:60个代表1分钟,如果你想30分钟后,它简单的方法更改为1800

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个文件存在的情况下,它才会继续。

在所有可能情况下,如果子进程可以接受一个额外的参数(这个子进程的“processfinished”文件的名称)而不是每个参数都有一个固定的数字,那将是最好的。

你可以扩展这个,并使用日期和时间来扩充文件名,这样整个过程本身可以并行运行多次。

BTW - 通过启动

@echo off 

的过程中,您可以删除所有领先的@ S的(一切确实是抑制命令报告为一个线。)

而且,start更快乐,因为start "" .....,也就是说,引号中有一个空窗口标题作为其第一个参数。这样可以根据需要“引用”其他参数 - 所使用的第一个“带引号”的参数被用作流程的“窗口标题”,并可能会丢失到子流程中。定期分配一个虚拟(如果有必要为空)“窗口标题”意味着你不会在未来绊倒这个问题。

1

有多个命令,你可以选择什么人来使用,

暂停,直到用户按下任意键

将暂停CMD。 显示消息,“按任意键继续...” 我使用此命令的某种变体,称为暂停> nul。 它所做的是暂停.bat,但不显示消息,你只是得到一个空白的屏幕!

TIMEOUT

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

非常漂亮的一个。 语法如下:PING 1.1.1.1 -n 1 -w 60000> NUL 这三个中可能最复杂的一个。 PING可以用来延迟执行几秒钟。

希望我帮了忙! -Logan