Esecuzione di più comandi da uno script cmd di Windows


136

Sto cercando di scrivere uno script cmd di Windows per eseguire diverse attività in serie. Tuttavia, si interrompe sempre dopo il primo comando nello script.

Il comando che si interrompe dopo è una build maven (non sono sicuro che sia rilevante).

Come posso farlo continuare ed eseguire ogni attività a turno per favore?

L'installazione di qualsiasi software o la configurazione del registro, ecc. È completamente fuori discussione - temo che debba funzionare su un'installazione vanilla di Windows XP.

Idealmente vorrei che lo script si interrompesse se uno qualsiasi dei comandi falliva, ma è un "bello da avere", non essenziale.

Grazie.

Risposte:


139

Quando chiami un altro file .bat, penso che tu abbia bisogno di "chiamare" prima della chiamata:

call otherCommand.bat

1
Ciao, nello script originale non stavo chiamando altri file .cmd, ma da allora l'ho diviso in file separati in modo da poterli eseguire ciascuno a turno. Quindi, mettere la chiamata davanti a ciascun comando sembra aver fatto il trucco, grazie!
Darren Greaves,

5
È un dato di fatto, su Windows, mvnè un file .bat da solo, quindi è necessario utilizzarlo callcome in call mvn install; normalmente non è necessario creare un file cmd aggiuntivo.
jfpoilpret,

2
Nota che non hai bisogno di punti e virgola nei file batch. E il motivo per cui è necessario utilizzare call è che mvn stesso è un file batch e i file batch devono chiamarsi a vicenda con call, altrimenti il ​​controllo non ritorna al chiamante.
Pushkar,

@Gulzar Nazim - Sai se posso mettere tutti i comandi in un singolo file batch con l'istruzione if-else poiché non voglio mantenerlo in diversi file batch?
Divertimento Ng2,

1
Stavo cercando di fare qualcosa di simile con npmaggiornamenti e protractortest. Non pensavo che questa risposta mi applicasse fino a quando non ho realizzato npme protractorsono .cmdfile su Windows.
joshden,

45

È possibile utilizzare il simbolo && tra i comandi per eseguire il secondo comando solo se il primo ha esito positivo. Maggiori informazioni qui http://commandwindows.com/command1.htm


Grazie, ci proverò insieme alla risposta accettata sopra.
Darren Greaves,

Questo interromperà l'esecuzione del secondo script se la compilazione di Maven fallisce?
Varun Achar,

Quel collegamento è interrotto: "Il server back-end non ha risposto in tempo. Il server app è troppo occupato e non è in grado di gestire le richieste in tempo."
kevinji,

1
@TheM Windows distingue tra applicazioni basate su GUI e basate su comandi (c'è un flag vicino all'inizio del file EXE). Se si avvia un'applicazione basata su GUI dalla riga di comando, questa sembra sempre terminare immediatamente poiché è completamente staccata dalla riga di comando. Se avvii un programma basato su comandi da un programma GUI (come Explorer) mostrerà sempre una nuova riga di comando. I sistemi POSIX non fanno tale distinzione, quindi il comportamento è più coerente.
coderforlife,

2
@TheM Per aggirare il problema puoi usarestart /B /WAIT calc
coderforlife

25

Non sono sicuro del motivo per cui il primo comando si sta arrestando. Se riesci a renderlo parallelo, puoi provare qualcosa di simile

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat

7
Utilizzare /Kinvece di /Cse si desidera che la shell rimanga aperta dopo l'esecuzione del comando.
JellicleCat,

Non c'è bisogno di usare cmd.exee start, semplicemente start x.bat1lo farà.
user66001

23

Ho appena fatto lo stesso identico compito (ish) di creare uno script batch per eseguire script di test Maven. Il problema è che la chiamata di script Mavn con mvn clean install ... è essa stessa uno script e quindi deve essere eseguita con call mvn clean install.

Codice che funzionerà

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

Nota piuttosto l'uso della chiamata. Ciò consentirà l'uso di script Maven consecutivi nel file batch.


5

L'uso della doppia e commerciale eseguirà il secondo comando, solo se il primo avrà esito positivo:

cd Desktop/project-directory && atom .

Dove come, usando solo una e commerciale tenterà di eseguire entrambi i comandi, anche se il primo fallisce:

cd Desktop/project-directory & atom .

1

Se si esegue Windows, è possibile utilizzare il comando seguente.

Guidare:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit

1

Non conosco la risposta diretta alla tua domanda, ma se fai molti di questi script, potrebbe valere la pena imparare una lingua più potente come il perl. Esistono implementazioni gratuite per Windows (ad esempio activestate, cygwin). Ho trovato utile lo sforzo iniziale per i miei compiti.

Modificare:

Come suggerito da @Ferruccio, se non è possibile installare software aggiuntivo, prendere in considerazione vbscript e / o javascript. Sono integrati nell'host di script di Windows.


Grazie ma non riesco a installare alcun software. Vorrei avere accesso a qualcosa di più potente del pessimo linguaggio di scripting di Windows. :-(
Darren Greaves,

6
Puoi sempre usare vbscript o javascript. Sono integrati nell'host di script di Windows.
Ferruccio,

0

Nota che non hai bisogno di punti e virgola nei file batch. E il motivo per cui è necessario utilizzare call è che mvn stesso è un file batch e i file batch devono chiamarsi a vicenda con call, altrimenti il ​​controllo non ritorna al chiamante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.