4

我有一堆批处理文件,每个批处理文件启动一堆可执行文件以同时运行。每个批处理文件启动 30 个可执行文件。当这 30 个完成后,我希望运行下一批可执行文件,一次再运行 30 个。.exe 是使用批处理文件中的“开始”命令调用的,它们工作得很好——我可以为每组 30 个 exe 运行单独的批处理文件,它们可以像应该的那样同时运行。

我创建了一个“主”批处理文件,它调用每个子批处理文件,但我不知道如何让它按顺序运行子批处理文件,等待一个完成后再开始下一个。

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

Batch1.bat
Batch2.bat
Batch3.bat

然后只调用第一个批处理文件-永远不会调用其他批处理文件。

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

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

然后所有子批处理文件同时开始运行,我得到数百个试图同时启动的可执行文件。

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

提前致谢,

游戏

4

6 回答 6

2

打扰一下。我认为这里有一个误解。如果您的主批处理文件是这样的:

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

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

于 2013-07-28T03:53:30.810 回答
2

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

MasterBatch.bat:

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

批处理1.bat

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

批处理2.bat

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

它可能适用于运行程序的其他问题。

于 2014-04-24T08:41:57.257 回答
2

当启动另一个批处理时,CALL 将在同一个窗口中启动它,并且被调用的批处理可以访问相同的变量上下文。所以它也可以改变影响调用者的变量。

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

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

希望这可以帮助

于 2013-07-27T23:58:45.780 回答
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

最后,第 3 级批次,Batch_3rd.BAT:

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

%*是从子批次(exe +参数)传递的参数,在创建时从子批次复制环境%Index%是正确的start,并且子批次不会更改此副本。最后一点:您可能可以将所有批处理合并到一个批处理文件中,递归调用它。

于 2013-07-29T09:42:06.233 回答
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 秒后重试

  • 如果文件未锁定,则可以创建重定向并启动下一个批处理文件。

于 2017-02-14T17:36:16.350 回答
0

我的解决方案:

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

2)Parent.bat 包含以下几行(请注意):

调用 Batch1.bat > result1.log

调用 Batch2.bat > result2.log

调用 Batch3.bat > result3.log

3)确保“进入每个子批处理文件的末尾”,您有一个回显语句。在这个 echo 语句之后不应该有任何代码......

说 Batch1.bat 文件的内容是:

回声开始

robocopy "C:\Users\DD\Documents\A" "C:\Users\DD\Documents\B"

回声结束

回显 this_is_the_last_line

于 2017-01-17T12:51:06.677 回答