Comment exécuter plusieurs.Les fichiers BAT à l'intérieur d'un.Le 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 uniquement le premier élément de la liste (msbuild.bat).

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

561
demandé sur Darshan Rivka Whittle 2009-07-09 17:47:14

13 réponses

Utiliser

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

Lorsque vous N'utilisez pas CALL, le fichier batch actuel s'arrête et le fichier batch appelé commence à s'exécuter. C'est un comportement particulier datant des premiers jours de MS-DOS

973
répondu Philippe Leybaert 2009-07-09 13:48:37

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

 call "msbuild.bat"

L'Histoire

Dans les anciennes versions dos, il n'était pas possible d'exécuter récursivement des fichiers batch. Ensuite, la commande call a été introduite qui a appelé un autre shell cmd pour exécuter le fichier batch et renvoyé l'exécution au shell cmd appelant une fois terminé.

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

Dans les premiers jours de nombreux fichiers batch dépendaient fait que l'appel d'un fichier batch ne reviendrait pas au fichier batch appelant. Changer ce comportement sans syntaxe supplémentaire aurait brisé de nombreux systèmes comme les systèmes de menu batch (en utilisant des fichiers batch pour les structures de menu).

Comme dans de nombreux 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 tout les noms des fichiers batch, vous pouvez également utiliser pour faire ceci: (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 errorlevels après un appel. Utiliser

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

Pour rendre un errorlevel. 0 indique une exécution correcte. Dans le fichier batch appelant, vous pouvez réagir en utilisant

if errorlevel neq 0 <batch command>

Utilisez if errorlevel 1 si vous avez un ancien Windows puis NT4 / 2000 / XP pour attraper tous les errorlevels 1 et plus.

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

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

Comme d'autres l'ont souligné: jetez un oeil aux systèmes de construction pour remplacer les fichiers batch.

159
répondu Ralph M. Rickenbach 2016-04-26 11:44:45

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

start cmd /k 

/k: est obligatoire qui exécutera.

Lancer de nombreux propmts de commande 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.
91
répondu farheen 2018-04-03 14:43:16

Essayez

call msbuild.bat
call unit-tests.bat
call deploy.bat
36
répondu Jonathan 2009-07-09 13:49:38

Vous appelez plusieurs lots dans le but de compiler un programme. Je prends pour acquis que si une erreur se produit:
1) le programme dans Le lot se terminera 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ête à chaque erreur, en laissant l'écran comme il est pour vous de voir un message d'erreur.

24
répondu Jay 2017-03-01 13:52:59
call msbuild.bat
call unit-tests.bat
call deploy.bat
19
répondu butterchicken 2009-07-09 13:49:51

Pour appeler un .bat fichier à l'intérieur d'un .bat fichier, utilisez

call foo.bat

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

18
répondu Zifre 2009-07-09 13:50:30

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

call aaa.bat
call bbb.bat

Lors de l'exécution du script, il appellera aaa.bat d'abord et attendez le fil de aaa.bat mettre fin alors appellera bbb.MTD

, Mais si vous ne voulez pas attendre aaa.bat mettre fin à 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
13
répondu user2314621 2013-10-29 16:31:44

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

7
répondu Dave Archer 2009-07-09 13:54:47
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

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

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat
5
répondu McOussKing 2014-08-15 14:44:22

Si vous voulez ouvrir plusieurs fichiers batch à la fois, vous pouvez utiliser la commande call, mais la commande call ferme le fichier bat actuel et passe à un autre si vous voulez en ouvrir plusieurs à la fois, vous pouvez essayer ceci

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

Et ainsi de suite ou répétez le début cmd "call..."pour cependant, de nombreux fichiers. cela fonctionne pour WIN 7 pas sûr des autres systèmes.

3
répondu CMS_95 2016-07-24 14:29:05

Exécuter plusieurs scripts dans un j'ai eu le même problème. Je continuais à le faire mourir sur le premier sans réaliser 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 supprimé toutes les 11 lignes de sortie de mes scripts et essayé à nouveau et tous les 11 ont couru dans l'ordre un à 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
2
répondu John Oliphant 2012-09-21 21:04:37

Utilisez simplement la commande call! Voici un exemple:

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

Cheers!

1
répondu PryroTech 2016-12-13 04:45:53