Por que apenas a primeira linha desse arquivo em lotes do Windows é executada, mas as três são executadas em um shell de comando?

171

Eu tenho um arquivo em lotes que executa três comandos do Maven, um após o outro. Cada comando pode ser executado com sucesso no script - por si só !. Mas quando adiciono todos os três comandos ao mesmo arquivo, apenas o primeiro é executado antes da saída do script. Alguma idéia do porquê?

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

Além disso, se eu copiar todos os três comandos e colá-los em um shell de comando (cmd.exe), eles serão executados um após o outro sem nenhum problema. Portanto, esse é aparentemente um problema com o arquivo em lotes dos.

wiki
fonte
2
Que coincedent: Eu vim aqui com o mesmo problema e também os mesmos comandos em meu arquivo de lote - várias linhas de "mvn install: install-file" :-D
espinha de peixe
Possível duplicata Como executar várias .bat dentro de um arquivo .bat
Peter Mortensen
1
@fishbone e coincidentemente você e OP ambos têm 1.3K reputação ..
p_champ

Respostas:

297

O Maven usa arquivos em lote para fazer seus negócios. Com qualquer script em lote, você deve chamar outro script usando o callcomando para que ele retorne ao seu script após a conclusão do script chamado. Tente anexar calla todos os comandos.

Outra coisa que você pode tentar é usar o startcomando que deve funcionar de maneira semelhante.

Jeff Mercado
fonte
1
Eu coloquei antdentro dos arquivos em lotes do Windows antes e callera necessário antpara executar. Sem callo lote será interrompido após o primeiro comando, portanto, os dois segundos não serão executados. microsoft.com/resources/documentation/windows/xp/all/proddocs/… para obter mais informações sobrecall
Owen
22
startfará com que uma nova janela apareça e cada um dos três comandos seja executado em paralelo. Se você precisar que eles sejam executados de forma síncrona, use call.
akf 27/10/10
11
Como diabos faz sentido que um ambiente de script se comporte dessa maneira? Se eu escrevi um script com dois comandos, espero que os comandos sejam executados; Não espero que o ambiente decida parar de executar meu script simplesmente porque um desses comandos é implementado como um script em si.
precisa saber é o seguinte
3
@ bames53: essa é uma limitação originada no DOS que foi transferida para implementações modernas do prompt de comando no Windows. Como os objetivos da Microsoft eram manter a compatibilidade com versões anteriores, esse é o resultado.
Jeff Mercado
2
adicionar call pauseno final (sem aspas) se você quiser manter as janelas cmd aberto
JinSnow
28

Tendo callajuda. No entanto, hoje não.

Foi assim que eu resolvi:

Conteúdo do arquivo Bat (se você deseja interromper o lote quando um dos erros do cmds)

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

Conteúdo do arquivo Bat (se você quiser continuar em lote quando um dos erros do cmds)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Manohar Reddy Poreddy
fonte
(O primeiro exemplo aqui é equivalente a cmd1 && cmd2 && cmd3 && cmd4, fazendo essencialmente todos os comandos de uma linha.)
Ben Gotow
2
Verdade. Eu escrevi dessa maneira porque é um arquivo bat, principalmente você terá vários comandos, possivelmente longos, 4 comandos em uma linha não serão bons em manutenção futura. A legibilidade é fundamental para escrever bons programas e, portanto, eles estão em linhas diferentes.
Manohar Reddy Poreddy
1
Esta solução fez o truque para mim. A callsolução não estava parando com os erros, este faz.
Tim
9

Para executar mais compilações do Maven a partir de um script, você deve usar a função de chamada do Windows da seguinte maneira:

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
Seweryn Habdank-Wojewódzki
fonte
1

Deveria ser que o mvncomando específico execs e não retornasse, portanto, não executando o restante dos comandos.

Alan Haggai Alavi
fonte
Existe uma maneira de forçar o script a executar o próximo mvncomando?
wiki
1

Tente escrever o seguinte arquivo em lotes e executá-lo:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Somente as duas primeiras linhas são executadas. Mas se você digitar "exit" no prompt de comando, as próximas duas linhas serão processadas. É uma concha carregando outra.

Para ter certeza de que não é isso que está acontecendo no seu script, basta digitar "exit" quando o primeiro comando terminar.

HTH!

Dr. belisarius
fonte
Improvável; O Maven realmente usa um arquivo em lotes e é por isso que eles precisam usar call. Não é um shell aninhado que não é finalizado.
Joey