Question Comment exécuter plusieurs fichiers .BAT dans un fichier .BAT


J'essaie d'obtenir 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 exécute seulement le premier élément de la liste (msbuild.bat).

J'ai couru chacun des dossiers séparément sans problèmes.


547
2017-07-09 13:47


origine


Réponses:


utilisation

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

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


948
2017-07-09 13:48



Toutes les autres réponses sont correctes: utilisez appel. par exemple:

 call "msbuild.bat"

Histoire

Dans les anciennes versions de DOS, il n'était pas possible d'exécuter de manière récursive des fichiers batch. Ensuite, la commande call a été introduite qui a appelé un autre shell cmd pour exécuter le fichier séquentiel et a renvoyé l'exécution à l'interpréteur de commande cmd une fois terminé.

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

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

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

Conseils

Si vos fichiers batch ont des espaces dans leurs noms, utilisez des guillemets autour du nom:

call "unit tests.bat"

En passant: si vous n'avez pas tous les noms des fichiers batch, vous pouvez également utiliser pour cela: (ne garantit pas l'ordre correct des appels par lots, suit l'ordre du système de fichiers)

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

Vous pouvez également réagir aux niveaux d'erreur après un appel. Utilisation

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

pour redonner un niveau d'erreur. 0 indique une exécution correcte. Dans le fichier de traitement par lots, 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 fait remarquer: jetez un oeil aux systèmes de construction pour remplacer les fichiers batch.


155
2017-07-09 14:02



Si nous voulons ouvrir l'invite de commande multiple, nous pourrions utiliser le

start cmd /k 

/k: est obligatoire qui va s'exécuter.

Le lancement de nombreuses commandes peut être fait comme ci-dessous.

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.

88
2017-08-27 05:17



essayer

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

36
2017-07-09 13:49



Vous appelez plusieurs lots dans le but de compiler un programme. Je tiens pour acquis que si une erreur se produit:
1) Le programme du lot sortira avec un niveau d'erreur;
2) Vous voulez savoir à ce sujet.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' teste un niveau d'erreur supérieur à 0. De cette façon, tous les lots sont appelés dans l'ordre, mais s'arrêtent à toute erreur, laissant l'écran tel quel pour vous permettre de voir un message d'erreur.


24
2017-08-18 12:40



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

19
2017-07-09 13:49



Pour appeler un .bat déposer dans un .bat fichier, utiliser

call foo.bat

(Oui, c'est idiot, cela aurait plus de sens si vous pouviez l'appeler avec foo.bat, comme vous le pouviez à partir de l'invite de commande, mais la bonne façon est d'utiliser call.)


18
2017-07-09 13:50



Si nous avons 2 batch script aaa.bat & bbb.bat et appelez comme ci-dessous

call aaa.bat
call bbb.bat

Quand exécuter le script, il appellera aaa.bat en premier et attendra que le fil de aaa.bat se termine puis appellera bbb.bat

Mais si vous ne voulez pas attendre aaa.bat, appelez 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

13
2017-10-29 16:31