Exécution de plusieurs commandes à partir d'un script cmd Windows

136

J'essaie d'écrire un script Windows cmd pour effectuer plusieurs tâches en série. Cependant, il s'arrête toujours après la première commande du script.

La commande après laquelle il s'arrête est une version maven (je ne sais pas si c'est pertinent).

Comment puis-je le faire continuer et exécuter chaque tâche à tour de rôle s'il vous plaît?

Installer un logiciel ou configurer le registre, etc. est complètement hors de question - cela doit fonctionner sur une installation Windows XP vanille, j'en ai peur.

Idéalement, j'aimerais que le script soit abandonné si l'une des commandes échoue, mais c'est un "bon à avoir", pas essentiel.

Merci.

Darren Greaves
la source

Réponses:

139

Lorsque vous appelez un autre fichier .bat, je pense que vous devez «appeler» avant l'appel:

call otherCommand.bat
Lou Franco
la source
1
Salut, dans le script d'origine, je n'appelais pas d'autres fichiers .cmd, mais je l'ai depuis divisé en fichiers séparés afin que je puisse exécuter chacun à son tour. Donc, mettre un appel devant chaque commande semble avoir fait l'affaire, merci!
Darren Greaves
5
En fait, sous Windows, mvnest un fichier .bat en lui-même, vous devez donc l'utiliser callcomme dans call mvn install; normalement, vous n'avez pas besoin de créer un fichier cmd supplémentaire.
jfpoilpret
2
Notez que vous n'avez pas besoin de points-virgules dans les fichiers de commandes. Et la raison pour laquelle vous devez utiliser call est que mvn lui-même est un fichier batch et que les fichiers batch doivent s'appeler avec call, sinon le contrôle ne revient pas à l'appelant.
Pushkar
@Gulzar Nazim - Savez-vous si je peux mettre toutes les commandes dans un seul fichier de commandes avec une instruction if-else car je ne veux pas le maintenir dans différents fichiers de commandes?
Ng2-Fun
1
J'essayais de faire quelque chose de similaire avec des npmmises à jour et des protractortests. Je ne pensais pas que cette réponse s'appliquait à moi jusqu'à ce que je réalise npmet que ce protractorsont des .cmdfichiers sous Windows.
joshden
45

Vous pouvez utiliser le symbole && entre les commandes pour exécuter la deuxième commande uniquement si la première réussit. Plus d'informations ici http://commandwindows.com/command1.htm

Steve
la source
Merci, je vais essayer en conjonction avec la réponse acceptée ci-dessus.
Darren Greaves
Cela arrêtera-t-il l'exécution du deuxième script si la compilation de maven échoue?
Varun Achar
Ce lien est rompu: "Le serveur principal n'a pas répondu à temps. Le serveur d'applications est trop occupé et ne peut pas traiter les demandes à temps."
kevinji
1
@TheM Windows fait la distinction entre les applications basées sur l'interface graphique et les applications basées sur les commandes (il y a un indicateur près du début du fichier EXE). Si vous démarrez une application basée sur l'interface graphique à partir de la ligne de commande, elle semble toujours se terminer immédiatement car elle est complètement détachée de la ligne de commande. Si vous démarrez un programme basé sur des commandes à partir d'un programme GUI (comme Explorer), il affichera toujours une nouvelle ligne de commande. Les systèmes POSIX ne font pas une telle distinction donc le comportement est plus cohérent.
coderforlife
2
@TheM Pour contourner cela, vous pouvez utiliserstart /B /WAIT calc
coderforlife
25

Je ne sais pas pourquoi la première commande s'arrête. Si vous pouvez le rendre parallèle, vous pouvez essayer quelque chose comme

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat
Gulzar Nazim
la source
7
Utilisez à la /Kplace de /Csi vous souhaitez que le shell reste ouvert après l'exécution de votre commande.
JellicleCat
Pas besoin d'utiliser cmd.exeet start, start x.bat1fera juste .
user66001
23

Je viens de faire exactement la même tâche (ish) de créer un script batch pour exécuter des scripts de test maven. Le problème est que l'appel de maven scrips avec mvn clean install ... est lui-même un script et doit donc être fait avec l'appel mvn clean install.

Code qui fonctionnera

rem run a maven clean install
cd C:\rbe-ui-test-suite 
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1

Notez plutôt l'utilisation de l'appel. Cela permettra l'utilisation de scripts maven consécutifs dans le fichier de commandes.

mhollander38
la source
5

L'utilisation de doubles esperluettes exécutera la deuxième commande, uniquement si la première réussit:

cd Desktop/project-directory && atom .

Où as, en utilisant une seule esperluette tentera d'exécuter les deux commandes, même si la première échoue:

cd Desktop/project-directory & atom .
JSON C11
la source
1

Si vous utilisez Windows, vous pouvez utiliser la commande suivante.

Conduire:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit
Pulendar Vadde
la source
1

Je ne connais pas la réponse directe à votre question, mais si vous faites beaucoup de ces scripts, cela pourrait valoir la peine d'apprendre un langage plus puissant comme perl. Des implémentations gratuites existent pour Windows (par exemple activestate, cygwin). J'ai trouvé que cela valait l'effort initial pour mes propres tâches.

Éditer:

Comme suggéré par @Ferruccio, si vous ne pouvez pas installer de logiciel supplémentaire, pensez à vbscript et / ou javascript. Ils sont intégrés à l'hôte de script Windows.

Monsieur Fooz
la source
Merci mais je ne peux installer aucun logiciel. J'aurais aimé avoir accès à quelque chose de plus puissant que le langage de script de Windows. :-(
Darren Greaves
6
Vous pouvez toujours utiliser vbscript ou javascript. Ils sont intégrés à l'hôte de script Windows.
Ferruccio
0

Notez que vous n'avez pas besoin de points-virgules dans les fichiers de commandes. Et la raison pour laquelle vous devez utiliser call est que mvn lui-même est un fichier batch et que les fichiers batch doivent s'appeler avec call, sinon le contrôle ne revient pas à l'appelant.

Pushkar
la source