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 cmd
” call
…” 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é!