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
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.
batch-file
cmd
Yvette
la source
la source
Réponses:
Utilisation:
Lorsque 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.
la source
Toutes les autres réponses sont correctes: utilisez l'appel. Par exemple:
Histoire
Dans les anciennes versions DOS, il n'était pas possible d'exécuter récursivement des fichiers batch. Ensuite, la commande d'appel a été introduite qui a appelé un autre shell cmd pour exécuter le fichier de commandes 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.
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 comme 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 donc la raison de ce comportement.
Conseils
Si vos fichiers batch ont des espaces dans leurs noms, utilisez des guillemets autour du nom:
Soit dit en passant: si vous n'avez pas tous les noms des fichiers de commandes, vous pouvez également utiliser for pour cela (cela ne garantit pas l'ordre correct des appels de fichiers de commandes; il suit l'ordre du système de fichiers):
Vous pouvez également réagir sur les niveaux d'erreur après un appel. Utilisation:
pour redonner un niveau d'erreur. 0 indique une exécution correcte. Dans le fichier batch appelant, vous pouvez réagir en utilisant
À utiliser
if errorlevel 1
si vous avez un Windows plus ancien que NT4 / 2000 / XP pour intercepter tous les niveaux d'erreur 1 et supérieurs.Pour contrôler le flux d'un fichier batch, il y a goto :-(
Comme d'autres l'ont souligné: jetez un œil aux systèmes de construction pour remplacer les fichiers batch.
la source
errorlevel
exemple de commande m'a donné un problème sur Windows 10 (dans la console cmd). J'ai simplement modifié la commande pour êtreif errorlevel neq echo Houston We have a Problem!
. Mon processus par lots n'a eu aucun problème et s'est terminé normalement, mais à chaque étape de la façon dont j'ai utilisé cette commande après une instruction d'appel, j'ai obtenu "neq était inattendu à ce moment". Pensant qu'ils ont peut-être changé la syntaxe non égale, j'ai essayé!=
et j'ai<>
continué à obtenir la même erreur "inattendue à ce moment" pour la nouvelle syntaxe. que pourrais-je faire de mal?Si nous voulons ouvrir plusieurs invites de commande, nous pouvons utiliser
/k
: est obligatoire qui s'exécutera.Le lancement de nombreuses invites de commande peut être effectué comme ci-dessous.
la source
start "Window title" /wait cmd /k call something.bat
pour exécuter les choses dans un ordre séquentiel.start "Window title" /wait cmd /c something.bat
, oùcmd /c
ferme la fenêtre une fois terminée)Essayer:
la source
Vous appelez plusieurs lots dans le but de compiler un programme. Je tiens pour acquis que si une erreur se produit:
1) Le programme dans le lot se terminera avec un niveau d'erreur;
2) Vous voulez en savoir plus.
«||» 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 qu'il vous permet de voir tout message d'erreur.
la source
Si nous avons deux scripts batch, aaa.bat et bbb.bat, et appelons comme ci-dessous
Lors de l'exécution du script, il appellera d'abord aaa.bat, attendra la fin du thread de aaa.bat et appellera bbb.bat.
Mais si vous ne voulez pas attendre que aaa.bat se termine pour appeler bbb.bat, essayez d'utiliser la commande START :
Examen:
la source
la source
Pour appeler un
.bat
fichier dans un.bat
fichier, utilisez(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 de l'utilisercall
.)la source
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 qu'avec les fichiers bat.
la source
Si vous souhaitez ouvrir plusieurs fichiers batch simultanément, vous pouvez utiliser la commande call. Cependant, la commande d'appel ferme le fichier bat en cours et passe à un autre. Si vous souhaitez en ouvrir plusieurs à la fois, vous pouvez essayer ceci:
Et ainsi de suite ou répétez le démarrage
cmd
"call
..." pour autant de fichiers. Cela fonctionne pour Windows 7 , mais je ne suis pas sûr des autres systèmes.la source
Si cela ne fonctionne pas, remplacez
start
parcall
ou essayez ceci:la source
Utilisez simplement la
call
commande! Voici un exemple:la source
Avec des citations correctes (cela peut parfois être délicat):
1er argument - Titre (vide dans ce cas)
2ème argument - / D spécifie le répertoire de départ, peut être omis si vous voulez que le répertoire de travail actuel (comme "% ~ dp0")
3ème argument - commande à lancer, "cmd.exe"
4ème arg - arguments à commander, avec des guillemets doublés pour les arguments qu'il contient (c'est ainsi que vous échappez les guillemets dans les guillemets en lot)
la source
Exécuter plusieurs scripts en un, j'ai eu le même problème. Je n'arrêtais pas de le faire mourir sur le premier sans me rendre compte qu'il sortait sur le premier script.
J'ai supprimé les 11 lignes de sortie de mes scripts et j'ai réessayé et les 11 ont été exécutés un par un dans la même fenêtre de commande.
la source
exit
s, remplacez-les par à lagoto :eof
place. Cela "reviendra" aucall
@echo off :menu some commands goto menu
. Fondamentalement, vous n'avez pas besoin du::
juste:
Ce qui suit a résolu mon problème:
la source
Peut-être voulez-vous ceci:
Exécutez les scripts batch en parallèle
Ici, trois fichiers de commandes sont exécutés sur des fenêtres de commande distinctes dans un état réduit. Si vous ne souhaitez pas les réduire, supprimez-les
/min
. De plus, si vous n'avez pas besoin de les contrôler plus tard, vous pouvez vous débarrasser des titres. Ainsi, une commande à nu serastart cmd /k call systemLogCollector.bat
Si vous souhaitez y mettre fin-
la source