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 génération.

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.

    utilisation

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

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

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

      call "msbuild.bat" 

    Histoire

    Dans les versions antérieures, il n’était pas possible d’exécuter récursivement des fichiers de commandes. Ensuite, la commande d’appel a été introduite et a appelé un autre shell cmd pour exécuter le fichier de commandes et a renvoyé l’exécution au shell cmd appelant lorsque vous avez terminé.

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

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

    Comme dans de nombreux cas avec Microsoft, la compatibilité descendante est la raison de ce comportement.

    Conseils

    Si vos fichiers de commandes comportent des espaces, utilisez des guillemets autour du nom:

     call "unit tests.bat" 

    Soit dit en passant: si vous ne disposez pas de tous les noms des fichiers batch, vous pouvez également utiliser pour cela: (ne garantit pas le bon ordre des appels de fichiers 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 rendre un niveau d’erreur. 0 indique une exécution correcte. Dans le fichier batch appelant, vous pouvez réagir en utilisant

     if errorlevel neq 0  

    Utilisez if errorlevel 1 si vous avez un Windows plus ancien que NT4 / 2000 / XP pour détecter tous les niveaux d’erreur 1 et plus.

    Pour contrôler le stream d’un fichier batch, il existe goto 🙁

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

    Comme d’autres l’ont fait remarquer: jetez un coup d’œil aux systèmes de construction pour remplacer les fichiers de commandes.

    Si nous voulons ouvrir plusieurs invite de commande alors nous pourrions utiliser le

     start cmd /k 

    /k : obligatoire qui s’exécutera.

    lancer 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. 

    essayer

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

    Vous appelez plusieurs lots pour tenter de comstackr un programme. Je prends pour acquis que si une erreur survient:
    1) Le programme dans le lot va sortir avec un errorlevel;
    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êteront à toute erreur, laissant l’écran tel quel pour vous permettre de voir un message d’erreur.

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

    Pour appeler un fichier .bat dans un fichier .bat , utilisez

     call foo.bat 

    (Oui, c’est idiot, cela serait plus logique si vous pouviez l’appeler avec foo.bat , comme vous pouvez le faire depuis l’invite de commande, mais la manière correcte est d’utiliser l’ call .)

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

     call aaa.bat call bbb.bat 

    Lorsque vous exécutez le script, il appelle d’abord aaa.bat et attend le thread de aaa.bat terminate puis appelle bbb.bat

    Mais si vous ne voulez pas attendre que aaa.bat se termine 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 ] [/WAIT] [/B] [command/program] [parameters] 

    Examen:

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

    En regardant vos noms de fichiers, avez-vous envisagé d’utiliser un outil de compilation comme nant ou ant (la version java). Vous aurez beaucoup plus de contrôle que les fichiers bat

     Start msbuild.bat Start unit-tests.bat Start deploy.bat 

    Si cela ne fonctionne pas, remplacez start par call ou essayez ceci:

     Start msbuild.bat Goto :1 :1 Start unit-tests.bat Goto :2 :2 Start deploy.bat 

    Si vous souhaitez ouvrir plusieurs fichiers de commandes à la fois, vous pouvez utiliser la commande d’appel, mais la commande d’appel ferme le fichier de chauve-souris actuel et passe à un autre si vous souhaitez en ouvrir plusieurs simultanément.

     @echo off start cmd "call ex1.bat&ex2.bat&ex3.bat" 

    et ainsi de suite ou répétez start cmdcall …” pour autant de fichiers. Cela fonctionne pour WIN 7 pas sûr des autres systèmes.

    Exécuter plusieurs scripts en un seul avait le même problème. Je l’ai fait mourir sur le premier ne réalisant pas qu’il sortait sur le premier script.

     :: OneScriptToRunThemAll.bat CALL ScriptA.bat CALL ScriptB.bat EXIT :: ScriptA.bat Do Foo EXIT ::ScriptB.bat Do bar EXIT 

    J’ai enlevé toutes les 11 lignes de scripts EXIT et essayé à nouveau et les 11 ont fonctionné dans l’ordre une à la fois dans la même fenêtre de commande.

     :: OneScriptToRunThemAll.bat CALL ScriptA.bat CALL ScriptB.bat EXIT ::ScriptA.bat Do Foo ::ScriptB.bat Do bar 

    Utilisez simplement la commande d’ call ! Voici un exemple:

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

    À votre santé!