Perché viene eseguita solo la prima riga di questo file batch di Windows ma tutte e tre le righe vengono eseguite in una shell dei comandi?


171

Ho un file batch che esegue tre comandi Maven, uno dopo l'altro. Ogni comando può essere eseguito con successo nello script - da solo !. Ma quando aggiungo tutti e tre i comandi allo stesso file, solo il primo viene eseguito prima della chiusura dello script. Qualche idea sul perché?

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

Inoltre, se copio tutti e tre i comandi e li incollo in una shell dei comandi (cmd.exe), vengono eseguiti uno dopo l'altro senza problemi. Quindi a quanto pare questo è un problema con il file batch dos.


2
Che coincidenza: sono venuto qui con lo stesso problema e anche gli stessi comandi nel mio file batch - più righe di "mvn install: file di installazione" :-D
lisca di pesce


1
@fishbone e per coincidenza entrambi tu e OP avete una reputazione di 1.3k ..
p_champ

Risposte:


297

Maven utilizza file batch per svolgere la propria attività. Con qualsiasi script batch, è necessario chiamare un altro script utilizzando ilcall comando in modo che sappia tornare allo script dopo il completamento dello script chiamato. Prova a anteporre calla tutti i comandi.

Un'altra cosa che potresti provare è usare il startcomando che dovrebbe funzionare in modo simile.


1
Ho già inserito i antfile batch di Windows in precedenza e mi è callstato richiesto antdi eseguirli. Senza callil batch si fermerà dopo il primo comando, quindi i secondi due non verranno eseguiti. microsoft.com/resources/documentation/windows/xp/all/proddocs/… per maggiori informazioni sucall
Owen,

22
startgenererà una nuova finestra e ciascuno dei tre comandi verrà eseguito in parallelo. Se sono necessari per l'esecuzione in modo sincrono, utilizzare call.
Akf

11
Come mai ha senso che un ambiente di scripting si comporti in questo modo? Se ho scritto uno script con due comandi, mi aspetto che i comandi vengano eseguiti; Non mi aspetto che l'ambiente decida semplicemente di interrompere l'esecuzione del mio script semplicemente perché uno di quei comandi sembra essere implementato come script stesso.
bames53,

3
@ bames53: questa è una limitazione originata da DOS che è stata trasferita nelle moderne implementazioni del prompt dei comandi in Windows. Poiché gli obiettivi di Microsoft erano mantenere la retrocompatibilità, questo è il risultato.
Jeff Mercado,

2
aggiungere call pausealla fine (senza virgolette) se si desidera mantenere aperte le finestre cmd
JinSnow

28

Avere callaiuti. Comunque oggi no.

Ecco come l'ho risolto:

Contenuto del file bat (se si desidera interrompere il batch in caso di errori cmds)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

Contenuto del file bat (se si desidera continuare in batch in caso di errori cmds)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(Il primo esempio qui equivale a cmd1 && cmd2 && cmd3 && cmd4, fondamentalmente rendendo tutti i comandi una riga.)
Ben Gotow,

2
Vero. L'ho scritto in questo modo perché è un file bat, per lo più avrai più comandi, possibilmente lunghi, 4 comandi in una riga non saranno buoni nella manutenzione futura. La leggibilità è la chiave per scrivere buoni programmi e quindi sono su linee diverse.
Manohar Reddy Poreddy,

1
Questa soluzione ha fatto il trucco per me. La callsoluzione non si è fermata agli errori, questo lo fa.
Tim

9

Per eseguire più build Maven da uno script è necessario utilizzare la funzione di chiamata di Windows nel modo seguente:

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

1

Dovrebbe essere che il mvncomando particolare execs e non ritorni, quindi non eseguendo il resto dei comandi.


C'è un modo per forzare lo script ad eseguire il mvncomando successivo ?
wiki

1

Prova a scrivere il seguente file batch ed eseguirlo:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Vengono eseguite solo le prime due righe. Ma se si digita "esci" al prompt dei comandi, vengono elaborate le due righe successive. È una shell che carica un'altra.

Per essere sicuro che questo non è ciò che sta accadendo nel tuo script, digita "exit" al termine del primo comando.

HTH!


Improbabile; Maven usa davvero un file batch ed è per questo che devono usarlo call. Non è una shell nidificata che non è terminata.
Joey,
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.