868 votes

Comment exécuter plusieurs fichiers .BAT à l'intérieur d'un même fichier .BAT ?

J'essaie de faire en sorte que mon commit-build.bat pour exécuter d'autres fichiers .BAT dans le cadre de notre processus de construction.

Contenu de commit-build.bat :

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

Cela semble assez simple, mais commit-build.bat n'exécute que le premier élément de la liste ( msbuild.bat ).

J'ai exécuté chacun des fichiers séparément sans aucun problème.

4 votes

@sean - Vous n'avez pas besoin d'installer le paquetage Cygwin complet pour que les utilitaires de ligne de commande fonctionnent. Retirez simplement toutes les dlls Cygwin du paquetage, placez-les dans un répertoire patché, mettez tous vos outils dans un autre répertoire patché et vous êtes prêt à fonctionner.

0 votes

En supposant que chacun de ces fichiers ne sont que des lots, pourquoi ne pas les mettre dans un seul grand fichier et utiliser la fonction de délai d'attente pour permettre à chaque fois de démarrer.

1458voto

Philippe Leybaert Points 62715

Utiliser

call msbuild.bat
call unit-tests.bat
call deploy.bat

Si vous n'utilisez pas CALL, le fichier de lot en cours s'arrête et le fichier de lot appelé commence à s'exécuter. C'est un comportement particulier qui remonte aux premiers jours de MS-DOS.

0 votes

C'est bizarre, j'ai essayé sans le "call" sous Windows 7 et je me souviens que cela a fonctionné, mais sous Windows xp, il fallait cette commande. Est-ce possible ?

9 votes

Sans appel, conformément à la spécification originale du DOS, devrait faire un enchaînement de commandes et NE PAS retourner. Une option populaire avant l'ajout de "CALL" était d'ouvrir une invite de commande enfant comme "command /c second.bat" qui retournera également la commande.

1 votes

J'ai eu le problème sous Windows 7 entreprise, donc ce n'est pas seulement xp.

204voto

Toutes les autres réponses sont correctes : utilisez call.

Histoire

Dans les anciennes versions de Dos, il n'était pas possible d'exécuter récursivement des fichiers batch. C'est alors qu'a été introduite la commande call qui appelait un autre interpréteur de commandes pour exécuter le fichier batch et renvoyait l'exécution à l'interpréteur de commandes appelant lorsque celle-ci était terminée.

Évidemment, dans les versions ultérieures, aucun autre shell cmd n'était plus nécessaire.

Au début, de nombreux fichiers batch dépendaient du fait que l'appel d'un fichier batch ne retournait pas au fichier batch appelant. Changer ce comportement sans syntaxe supplémentaire aurait cassé de nombreux systèmes comme les systèmes de menus batch (utilisant des fichiers batch pour les structures de menus).

Comme dans de nombreux cas avec Microsoft, la rétrocompatibilité est donc la raison de ce comportement.

Conseils

Si vos fichiers batch comportent des espaces dans leur nom, utilisez des guillemets autour du nom :

call "unit tests.bat"

A propos : si vous n'avez pas tous les noms des fichiers batch, vous pouvez aussi utiliser for pour faire ceci : (dfoes ne garantit pas l'ordre correct des appels de fichiers batch, suit l'ordre du système de fichiers)

FOR %x IN (*.bat) DO call "%x"

Vous pouvez également réagir sur les niveaux d'erreur après un appel. Utilisez

exit /B 1   # or any other integer value in 0..255

pour renvoyer un niveau d'erreur. 0 dénote une exécution correcte. Dans le fichier batch appelant, vous pouvez réagir en utilisant

if errorlevel neq 0 <batch command>

Utilisez si errorlevel 1 si vous avez un Windows plus ancien que NT4/2000/XP pour attraper tous les niveaux d'erreur 1 et plus.

Pour contrôler le flux d'un fichier batch, il y a goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Comme d'autres l'ont souligné, examinez les systèmes de construction pour remplacer les fichiers batch.

0 votes

D'accord, mais la boucle pourrait, dans ce cas, traiter les fichiers dans le mauvais ordre (alphabétique ?)

0 votes

Réponse agréable et très complète. Si vous incluez le flux de contrôle, il serait bon de noter qu'au lieu de goto, vous pouvez créer des sous-programmes en utilisant call :label1 , et que l'instruction "retour" dans les fichiers de traitement par lots est le légèrement étrange goto :eof (et il n'est pas nécessaire de créer un label eof vous-même, il existe par défaut).

0 votes

Le site errorlevel L'exemple de la commande m'a posé un problème sous Windows 10 (dans la console cmd). J'ai modifié la commande simplement pour qu'elle soit if errorlevel neq echo Houston We have a Problem! . Mon traitement par lots n'a pas eu de problème et s'est déroulé normalement, mais à chaque étape où j'ai utilisé cette commande après une instruction d'appel, j'ai obtenu "neq was unexpected at this time". Pensant qu'ils avaient peut-être changé la syntaxe de not-equal, j'ai essayé != et aussi <> mais je continue à obtenir la même erreur "not expected at this time" pour la nouvelle syntaxe. Qu'est-ce que je pourrais faire de mal ?

159voto

farheen Points 315

Si nous voulons ouvrir plusieurs invite de commande, nous devrions utiliser

start cmd /k 

/k : est obligatoire qui sera exécuté.

Le lancement de nombreuses commandes peut se faire comme suit.

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.

12 votes

C'est ce que nous cherchions, car notre première application bloque la console, merci pour l'astuce.

2 votes

Ceci exécutera plusieurs instances de la commande et fonctionnera même pour l'exécution de plusieurs fichiers batch qui ont <pause>. +1 car c'est exactement la solution que je recherchais !

6 votes

Pourriez-vous expliquer pourquoi ces chiffres sont dans votre réponse ? Leur but n'est pas clair.

44voto

Jonathan Points 6611

Essayez

call msbuild.bat
call unit-tests.bat
call deploy.bat

32voto

user2314621 Points 41

Si nous avons 2 lots script aaa.bat & bbb.bat et appelons comme ci-dessous

call aaa.bat
call bbb.bat

Quand on exécute le script, il appellera d'abord aaa.bat et attendra que le thread de aaa.bat se termine puis appellera bbb.bat.

Mais si vous ne voulez pas attendre la fin de aaa.bat pour appeler bbb.bat, essayez d'utiliser la commande START

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

Examen :

start /b aaa.bat
start /b bbb.bat

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X