Executando vários comandos a partir de um script cmd do Windows

136

Estou tentando escrever um script cmd do Windows para executar várias tarefas em série. No entanto, ele sempre para após o primeiro comando no script.

O comando que ele interrompe é uma compilação maven (não tenho certeza se isso é relevante).

Como faço para continuar e executar cada tarefa, por sua vez, por favor?

Instalar qualquer software ou configurar o registro, etc, está completamente fora de questão - receio que funcione em uma instalação básica do Windows XP.

Idealmente, eu gostaria que o script fosse cancelado se algum dos comandos falhasse, mas isso é "bom de se ter", não essencial.

Obrigado.

Grevas de Darren
fonte

Respostas:

139

Quando você chama outro arquivo .bat, acho que você precisa "ligar" na frente da chamada:

call otherCommand.bat
Lou Franco
fonte
1
Oi, no script original, eu não estava chamando outros arquivos .cmd, mas desde então o dividi em arquivos separados para que eu possa executar cada um deles. Então, colocar a chamada na frente de cada comando parece ter funcionado, obrigado!
Darren Greaves
5
Por uma questão de fato, no Windows, mvné um arquivo .bat por si só; portanto, você precisa usá call-lo como em call mvn install; normalmente você não precisa criar um arquivo cmd extra.
Jfpoilpret 13/09/12
2
Observe que você não precisa de ponto e vírgula em arquivos em lotes. E a razão pela qual você precisa usar a chamada é que o próprio mvn é um arquivo em lotes e os arquivos em lotes precisam se chamar com chamada, caso contrário, o controle não retorna ao chamador.
Pushkar
@Gulzar Nazim - Você sabe se posso colocar todos os comandos em um único arquivo em lotes com a instrução if-else, pois não quero mantê-los em diferentes arquivos em lotes?
Ng2-Fun
1
Eu estava tentando fazer algo semelhante com npmatualizações e protractortestes. Eu acho que essa resposta não se aplicava a mim até que eu percebi npme protractorsou um .cmdarquivo no Windows.
joshden
45

Você pode usar o símbolo && entre os comandos para executar o segundo comando apenas se o primeiro for bem-sucedido. Mais informações aqui http://commandwindows.com/command1.htm

Steve
fonte
Obrigado, tentarei em conjunto com a resposta aceita acima.
Darren Greaves
Isso interromperá a execução do segundo script se a construção do maven falhar?
Varun Achar 14/05
Esse link está quebrado: "O servidor de back-end não respondeu a tempo. O servidor de aplicativos está muito ocupado e não pode lidar com solicitações a tempo".
Kevinji
1
O @TheM Windows distingue entre aplicativos baseados em GUI e baseados em comandos (há um sinalizador no início do arquivo EXE). Se você iniciar um aplicativo baseado em GUI a partir da linha de comando, ele sempre parecerá terminar imediatamente, pois é completamente desanexado da linha de comando. Se você iniciar um programa baseado em comando a partir de um programa GUI (como o Explorer), ele sempre mostrará uma nova linha de comando. Os sistemas POSIX não fazem essa distinção, portanto, o comportamento é mais consistente.
Coderforlife
2
@TheM Para contornar este problema você pode usarstart /B /WAIT calc
coderforlife
25

Não sei por que o primeiro comando está sendo interrompido. Se você pode torná-lo paralelo, você pode tentar algo como

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat
Gulzar Nazim
fonte
7
Use em /Kvez de /Cse desejar que o shell permaneça aberto após a execução do seu comando.
JellicleCat
Não há necessidade de usar cmd.exee start, apenas start x.bat1fará.
user66001
23

Acabei de fazer a mesma tarefa (ish) de criar um script em lote para executar scripts de teste maven. O problema é que chamar scripts maven com mvn clean install ... é um script e, portanto, precisa ser feito com a chamada mvn clean install.

Código que funcionará

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

Observe antes o uso da chamada. Isso permitirá o uso de scripts maven consecutivos no arquivo em lotes.

mhollander38
fonte
5

O uso de "e comercial" duplo executará o segundo comando, apenas se o primeiro for bem-sucedido:

cd Desktop/project-directory && atom .

Onde, o uso de apenas um e comercial tentará executar os dois comandos, mesmo se o primeiro falhar:

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

Se você estiver executando no Windows, poderá usar o seguinte comando.

Dirigir:

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

Não sei a resposta direta à sua pergunta, mas se você executar muitos desses scripts, poderá valer a pena aprender uma linguagem mais poderosa como o perl. Existem implementações gratuitas para Windows (por exemplo, activeestate, cygwin). Eu achei que vale o esforço inicial para minhas próprias tarefas.

Editar:

Conforme sugerido por @Ferruccio, se você não conseguir instalar software extra, considere vbscript e / ou javascript. Eles estão embutidos no host de scripts do Windows.

Mr Fooz
fonte
Obrigado, mas não consigo instalar nenhum software. Eu gostaria de ter acesso a algo mais poderoso do que a linguagem de script ruim do Windows. :-(
Darren Greaves
6
Você sempre pode usar vbscript ou javascript. Eles estão embutidos no host de scripts do Windows.
Ferruccio
0

Observe que você não precisa de ponto e vírgula em arquivos em lotes. E a razão pela qual você precisa usar a chamada é que o próprio mvn é um arquivo em lotes e os arquivos em lotes precisam se chamar com chamada, caso contrário, o controle não retorna ao chamador.

Pushkar
fonte