2013-07-27 70 views
2

我有一堆批处理文件,每个批处理文件都会启动一组可执行文件并行运行。每个批处理文件启动30个可执行文件当这30个完成时,我希望下一批可执行文件再次运行30次。使用批处理文件中的“start”命令调用.exe文件,它们工作得很好 - 我可以为每个30个exe文件组运行单个批处理文件,并且它们可以像他们应该那样同时运行。无法在Win7中的主批处理文件中顺序运行多个批处理文件

我已经创建了一个调用每个子批处理文件的“主”批处理文件,但我无法弄清楚如何让它按顺序运行子批处理文件,等待一个完成后再开始下一个。

如果主批处理文件是这样的:

Batch1.bat 
Batch2.bat 
Batch3.bat 

那么只有第一个批处理文件叫做 - 别人永远不会被调用。

如果主批处理文件是这样的:

call Batch1.bat 
call Batch2.bat 
call Batch3.bat 

那么所有的子批处理文件开始在同一时间运行,我得到数百可执行文件试图在同一时间来启动的。

如何让主批处理文件调用第一批文件,等待它完成,然后调用下一个,等待它完成,然后调用下一个等?

由于提前,

rgames

+0

的问题并不在于捕捉文件并行运行。这是你使用“开始”来运行exes。 “开始”不等待程序退出。删除“开始”关键字。 –

+0

我想同时在每个批处理文件中运行所有30个exe文件,所以我需要使用“启动”。如果我不使用“开始”,那么30个exe不会同时运行。我希望批处理文件能够连续运行,但我希望每个批处理文件中的exe能够同时运行。 –

+0

怎么样用'start“启动你的exes Myexe一个”one.exe''启动“Myexe两个”two.exe'等等。然后你可以检查它们中的一些是否仍在运行'tasklist | find“Myexe”' – Stephan

回答

2

当启动另一批电话将在同一窗口中启动它和被叫一批具有访问相同的变量上下文。所以它也可以改变影响调用者的变量。

在批处理文件中使用等待来调用可执行文件将等待它们退出之前。

START /WAIT batch1.bat 
START /WAIT batch2.bat 

希望这有助于

+0

谢谢,但那似乎不起作用。它在Batch1.bat后仍然停止。但是,还有两个cmd.exe窗口只是坐在那里打开。一个命令行带有“START/WAIT Batch1.bat”,另一个似乎显示来自Batch1.bat的所有命令。我是否需要从子批处理文件中添加某种“返回”语句?退出命令不起作用。 –

+0

它的工作原理是等待batch1.bat退出,然后batch2.bat将按照您的要求运行。为什么你的batch1.bat不能退出是你必须找到的。您也可以使用'start“”/ w/b batch1.bat“,它将在同一个cmd窗口中等待并运行它。 ''“'用于防止命令中的引用路径导致问题。 – foxidrive

+0

如果我在主批处理文件中使用'start'“/ w/b batch1.bat'等,那么它会立即运行所有批处理文件,并且所有批处理中的所有可执行文件都会同时运行。事实上 - 看起来batch1.bat永远不会退出 - 该批处理文件的窗口只是在那里使用命令提示符,等待发生某些事情。我如何告诉batch1.bat关闭它的窗口?我想这就是为什么第二个窗口在那里 - 这是主批处理文件等待batch1.bat窗口关闭的窗口。我的问题没有解决,但我正在学习somthing ...!任何其他想法? –

2

对不起。我认为这里有一个误解。如果你的主批处理文件是这样的:

call Batch1.bat 
call Batch2.bat 
call Batch3.bat 

然后Batch1.bat结束后Batch2.bat被调用,等等。你可以做一个小测试来证实这一点。另一方面,有可能每个BatchN.bat程序使用相同的变量?如果是这样,那么从Batch1.bat剩下的最后值可能会干扰Batch2.bat,等等。在这种情况下,您必须在每个批处理文件的开头添加一个Setlocal命令。

+0

每个子批处理文件(batch1.bat,batch2.dat等)都有'set tempDir =%CD%'作为第一行。它这样做是因为它将目录从当前根目录切换下来,在该目录中启动.exe,然后切换回根目录,以便它可以切换到下一个目录并启动下一个.exe。我已经尝试过,没有setlocal也没有区别。我不希望它 - 被设置的变量应该始终是相同的。 –

0

您将不得不创建一个信号机制来了解EXE补充。

我会创建一个第三级批处理来运行每个EXE,在执行EXE之前创建一个临时文件并在删除之后删除它。

在子批次中,我会等到没有更多的临时文件。

因此,首批:

call Batch1.bat 
call Batch2.bat 
call Batch3.bat 

分批次:

Set Index=0 
Call :Exec exefile1 args ... 
Call :Exec exefile2 args ... 
... 
:WaitAll 
If Exist %Temp%\RUNNING_EXE.*.TMP GoTo :WaitAll 
GoTo :EOF 

:Exec 
Set /A Index+=1 
Echo %Index% > %Temp%\RUNNING_EXE.%Index%.TMP 
Start Batch_3rd.BAT %* 
GoTo :EOF 

最后,第三级批,Batch_3rd.BAT:从子通过

%* 
Del %Temp%\RUNNING_EXE.%Index%.TMP 

%*有观点-batch(exe +参数),%Index%正确为start copies envi创建时从子批次创建子批次,并且子批次不会更改此副本。 最后一个注意事项:您可以将所有批次合并到一个批处理文件中,并递归调用它。

2

我不得不为几个文件运行数据导出程序。我的解决办法:

MasterBatch.bat:

@echo off 
start /w batch1.bat 
start /w batch2.bat 

Batch1.bat

@echo off 
cmd /c "c: & cd Program Files (x86)/PATH & targetProgram.exe -parametersToExportVideo1" 
EXIT 

Batch2.bat

@echo off 
cmd /c "c: & cd Program Files (x86)/PATH & targetProgram.exe -parametersToExportVideo2" 
EXIT 

它可以适用于运行程序等问题。

0

我的解决办法:

1) 我有四个批处理文件: Parent.bat和Batch1.bat,Batch2.bat,Batch3.bat

2) Parent.bat包含以下行(需要密切注意):

呼叫Batch1.bat> result1.log

呼叫Batch2.bat> result2.log

call Batch3.bat> result3.log

3) 请确保“到每个子批处理文件的末尾”,您都有一个echo语句。 在此回声声明之后,不应该有任何代码...

说出Batch1的内容。bat文件是:

回声开始

ROBOCOPY “C:\用户\ DD \文件\ A”, “C:\用户\ DD \文件\ B”

回波端

回波this_is_the_last_line

0

只是用于测试,我会用简单的分批次样(所有的人都是一样的)

@echo off 
    for /l %%a in (1 1 5) do start "" notepad.exe 

和主批处理文件

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "flagFile=%temp%\%random%%random%%random%.tmp" 

    for %%a in ("batch1.cmd" "batch2.cmd" "batch3.cmd") do (
     call :startBatch %%a "%flagFile%" 
    ) 

:retryClean 
    echo %time% waiting for last batch to end 
    2>nul (9>"%flagFile%" break) || (>nul timeout 5 & goto :retryClean) 
    del /q "%flagFile%" 

    echo DONE 
    pause 
    goto :eof 

:startBatch batchFile flagFile 
    echo %time% waiting to start "%~1" 
    2>nul (9>"%~2" call "%~1") || (>nul timeout 5 & goto :startBatch) 
    echo %time% [ "%~1" ] STARTED 
    goto :eof 

此代码启动每个子批次的与活性重定向(用户可用物流9时)到一个临时文件标志。这将锁定标志文件,直到从子批处理开始的所有进程都已经结束,因为重定向在进程创建期间被继承。

所有我们要做的就是继续努力,用相同的重定向开始下一个批处理文件:

  • 如果该文件仍然锁定(进程正在运行),批处理文件不能启动,等待5秒钟,然后重新尝试

  • 如果文件没有锁定,可以创建重定向和下一个批处理文件启动。