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.
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
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.
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.
Essayez
call msbuild.bat
call unit-tests.bat
call deploy.bat
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.
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
.)
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
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
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
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.
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
Utilisez simplement la commande call
! Voici un exemple:
call msbuild.bat
call unit-tests.bat
call deploy.bat
Cheers!