2012-09-25 36 views
13

Tengo 4 archivos por lotes. Quiero ejecutar one.bat y two.bat a la vez, al mismo tiempo. Una vez completados estos dos archivos por lotes, se deben ejecutar three.bat y four.bat a la vez, en paralelo. Lo intenté de muchas maneras, pero mot funciona bien.Esperando secuencias paralelas de proceso por lotes

¿Alguien puede ayudarme con esto?

Respuesta

3

Crea un archivo master.bat que inicia one.bat y two.bat. Cuando one.bat y two.bat final correctamente, se hacen eco de que hayan terminado de presentar

if errorlevel 0 echo ok>c:\temp\OKONE 
if errorlevel 0 echo ok>c:\temp\OKTWO 

Entonces el master.bat esperar a que la existencia de los dos archivos

del c:\temp\OKONE 
del c:\temp\OKTWO 
start one.bat 
start two.bat 
:waitloop 
if not exist c:\temp\OKONE (
    sleep 5 
    goto waitloop 
    ) 
if not exist c:\temp\OKTWO (
    sleep 5 
    goto waitloop 
    ) 
start three.bat 
start four.bat 

Otra forma es tratar de con la bandera/WAIT

start /WAIT one.bat 
start /WAIT two.bat 

pero no tiene control alguno sobre los errores.

Aquí hay algunas referencias

http://malektips.com/xp_dos_0002.html

http://ss64.com/nt/sleep.html

http://ss64.com/nt/start.html

+4

'start/WAIT xxx' espera a que xxx termine antes de permitir que la ejecución pase a la siguiente línea en el archivo por lotes. Entonces 'one.bat' tendría que terminar antes de que' two.bat' pudiera incluso comenzar. Usted PODRÍA asumir que 'one.bat' siempre terminará primero y usar' start/wait two.bat', pero eso es toda una suposición. Por cierto, no es necesario 'iniciar four.bat', simplemente' puede llamar a four.bat', (o incluso dejar de 'llamar' si no se hace nada más después de ejecutar' four.bat') y guarde la memoria que se usaría al iniciar otro procesador de comandos. –

+0

Marcado como útil para el enfoque compartido antes de la mención de inicio/ESPERA. También asegúrese de eliminar esos archivos de master.bat antes de iniciar one.bat y two.bat. –

+0

Gracias por la sugerencia, edité la publicación en consecuencia :-) –

14

Esto se hace fácilmente usando una versión muy simplificada de una solución que he proporcionado para Parallel execution of shell processes. Consulte esa solución para obtener una explicación de cómo funciona el bloqueo de archivos.

@echo off 
setlocal 
set "lock=%temp%\wait%random%.lock" 

:: Launch one and two asynchronously, with stream 9 redirected to a lock file. 
:: The lock file will remain locked until the script ends. 
start "" cmd /c 9>"%lock%1" one.bat 
start "" cmd /c 9>"%lock%2" two.bat 

:Wait for both scripts to finish (wait until lock files are no longer locked) 
1>nul 2>nul ping /n 2 ::1 
for %%N in (1 2) do (
    (rem 
) 9>"%lock%%%N" || goto :Wait 
) 2>nul 

::delete the lock files 
del "%lock%*" 

:: Launch three and four asynchronously 
start "" cmd /c three.bat 
start "" cmd /c four.bat 
+0

Esto funcionó muy bien para mis necesidades. ¡Gracias! Lo que también necesitaba era garantizar que esos comandos funcionaran con éxito. Por lo tanto, se parece más a: start "" 9> "% lock% 1" CMD/C "one.bat> one-log.txt 2> & 1 && echo success> one-success.txt" ... luego, asegurar que cada uno de ellos tenga éxitoel archivo txt existe, y escribe la salida de cada -log.txt. – macetw

+0

@macetw me gustaría ver su solución que verifica el éxito en un bloque de código para que sea legible. ¿Podría editar la respuesta anterior o enviar su bloque de código como respuesta? – SketchBookGames

+1

para esperar, puede usar ['1> nul 2> nul timeout 1' en lugar de ping] (http://stackoverflow.com/q/1672338/995714) –

5

Tuve este mismo dilema. Esta es la forma en que resolví este problema. utilicé el comando de lista de tareas para supervisar si el proceso todavía se está ejecutando o no:

:Loop 
tasklist /fi "IMAGENAME eq <AAA>" /fi "Windowtitle eq <BBB>"|findstr /i /C:"<CCC>" >nul && (
timeout /t 3 
GOTO :Loop 
) 
echo one.bat has stopped 
pause 

Tendrá que ajustar los valores

<AAA>, <BBB>, <CCC>

en el guión para que quede correctamente filtrado para tu proceso

Espero que ayude.

Cuestiones relacionadas