Comment attendre que tous les fichiers batch se terminent avant de quitter?

J’ai un fichier batch principal qui appelle 4 autres fichiers batch afin que nous puissions fonctionner en parallèle.

Exemple:

Main.bat

start call batch1.bat start call batch2.bat start call batch3.bat start call batch4.bat exit 

Je souhaite que le fichier Main.bat se ferme après que tout le lot 1 au lot 4 a cessé de s’exécuter. De cette façon, je peux obtenir le temps d’exécution total du fichier de commandes. Le problème est que Main.bat se ferme avant même que le traitement par lots 1 à 4 ne se termine.

J’ai essayé de calculer% errorlevel% pour chaque fichier batch, mais il renvoie toujours 0 même si les 4 fichiers .bat sont toujours en cours d’exécution.

En espérant que quelqu’un puisse m’aider!

Je vous remercie! 🙂

Je pense que c’est le moyen le plus simple et le plus efficace:

 @echo off echo %time% ( start call batch1.bat start call batch2.bat start call batch3.bat start call batch4.bat ) | set /P "=" echo %time% 

Dans cette méthode, l’état d’attente dans le fichier principal dépend de l’ événement , de sorte qu’il ne consum pas de temps CPU!

EDIT : Quelques explications ajoutées

La commande set /P se terminerait lorsqu’une des commandes de la ( block ) produirait une ligne, mais que les commandes de start n’indiquent aucune ligne dans cette cmd.exe . De cette manière, set /P continue d’attendre la saisie jusqu’à la fin de tous les processus démarrés par les commandes de start . À ce stade, le pipeline associé au ( block ) est fermé, donc le set /P Stdin est fermé et la commande set /P est terminée par le système d’exploitation.

donner une chaîne de titre unique aux nouveaux processus, puis vérifier si des processus avec cette chaîne dans le titre sont en cours d’exécution:

 start "+++batch+++" batch1.bat start "+++batch+++" batch2.bat start "+++batch+++" batch3.bat start "+++batch+++" batch4.bat :loop timeout /t 1 >nul tasklist /fi "windowtitle eq +++batch+++*" |find "cmd.exe" >nul && goto :loop echo all tasks finished 

( find est utilisé, car la liste des tasklist ne renvoie pas un niveau d’erreur utile)

Essayez ceci.

 @echo off echo %time% start "" /wait cmd /c bat1.bat |start "" /wait cmd /c bat2.bat |start "" /wait cmd /c bat3.bat echo %time% pause 

Vous pourriez avoir batch1..batchn4 créer des fichiers d’indicateur quand ils ont fini de s’exécuter.

par exemple echo y > flag1 dans batch1.bat

Ensuite, dans le fichier batch principal, vérifiez l’existence des fichiers d’indicateur avant de quitter. Vous auriez besoin d’une sorte d’utilitaire de veille pour faire quelque chose comme ça à la fin du fichier de commandes principal:

 IF EXIST flag1 GOTO check2 sleep  goto check1 :check2 IF EXIST flag2 GOTO check3 sleep  goto check2 :check3 IF EXIST flag3 GOTO check4 sleep  goto check3 :check4 IF EXIST flag4 GOTO xit sleep  goto check4 :xit 

L’inconvénient de cette technique est que votre calendrier sera un peu décalé, car vous interrogez les fichiers d’indicateurs au lieu d’être pilotés par des événements. Cela peut ou peut ne pas être un problème dans votre situation. Les fichiers batch sont assez limités de cette manière. Vous feriez peut-être mieux d’essayer de le faire dans PowerShell ou Python ou dans un autre langage de script plus performant.