Estou tentando fazer com que meus commit-build.bat
outros arquivos .BAT sejam executados como parte do nosso processo de compilação.
Conteúdo de commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
Isso parece bastante simples, mas commit-build.bat
apenas executa o primeiro item da lista ( msbuild.bat
).
Eu executei cada um dos arquivos separadamente, sem problemas.
batch-file
cmd
Yvette
fonte
fonte
Respostas:
Usar:
Quando não estiver usando CALL, o arquivo em lotes atual será interrompido e o arquivo em lote chamado começará a ser executado. É um comportamento peculiar que remonta aos primeiros dias do MS-DOS.
fonte
Todas as outras respostas estão corretas: use call. Por exemplo:
História
Nas versões antigas do DOS, não era possível executar recursivamente arquivos em lote. Em seguida, foi introduzido o comando de chamada que chamou outro shell do cmd para executar o arquivo em lotes e retornou a execução de volta ao shell do cmd quando terminar.
Obviamente, em versões posteriores, nenhum outro shell cmd era mais necessário.
Nos primeiros dias, muitos arquivos em lotes dependiam do fato de que a chamada de um arquivo em lotes não retornaria ao arquivo em lotes de chamada. Alterar esse comportamento sem sintaxe adicional teria quebrado muitos sistemas, como sistemas de menus em lotes (usando arquivos em lotes para estruturas de menus).
Como em muitos casos com a Microsoft, a compatibilidade com versões anteriores, portanto, é a razão desse comportamento.
Dicas
Se seus arquivos em lotes tiverem espaços em seus nomes, use aspas ao redor do nome:
A propósito: se você não tiver todos os nomes dos arquivos em lote, também poderá usá-lo (isso não garante a ordem correta das chamadas de arquivos em lote; segue a ordem do sistema de arquivos):
Você também pode reagir aos níveis de erro após uma chamada. Usar:
para retornar um nível de erro. 0 indica execução correta. No arquivo em lotes de chamada, você pode reagir usando
Use
if errorlevel 1
se você tiver um Windows mais antigo que o NT4 / 2000 / XP para capturar todos os níveis de erro 1 e superior.Para controlar o fluxo de um arquivo em lotes, existe o seguinte :-(
Como outros apontaram: dê uma olhada nos sistemas de compilação para substituir arquivos em lote.
fonte
errorlevel
exemplo de comando me deu um problema no Windows 10 (no console do cmd). Eu modifiquei o comando simplesmente para serif errorlevel neq echo Houston We have a Problem!
. Meu processo em lote não teve problemas e foi concluído normalmente, mas em todas as etapas em que usei esse comando após uma declaração de chamada, obtive "neq era inesperado no momento". Pensando que eles podem ter alterado a sintaxe diferente, tentei!=
e também<>
continuava recebendo o mesmo erro "não esperado no momento" para a nova sintaxe. o que eu poderia estar fazendo de errado?Se queremos abrir vários prompts de comando, podemos usar
/k
: é obrigatório que será executado.O lançamento de muitos prompts de comando pode ser feito como abaixo.
fonte
start "Window title" /wait cmd /k call something.bat
para executar as coisas em ordem seqüencial.start "Window title" /wait cmd /c something.bat
, ondecmd /c
fecha a janela uma vez terminado)Tentar:
fonte
Você está chamando vários lotes em um esforço para compilar um programa. Tomo como certo que, se ocorrer um erro:
1) O programa no lote será encerrado com um nível de erro;
2) Você quer saber sobre isso.
'||' testa um nível de erro maior que 0. Dessa forma, todos os lotes são chamados em ordem, mas param a qualquer erro, deixando a tela como é para você ver qualquer mensagem de erro.
fonte
Se tivermos dois scripts em lote, aaa.bat e bbb.bat, e chame como abaixo
Ao executar o script, ele chamará aaa.bat primeiro, espere o encadeamento de aaa.bat terminar e chame bbb.bat.
Mas se você não quiser esperar que o aaa.bat termine para chamar bbb.bat, tente usar o comando START :
Exame:
fonte
fonte
Para chamar um
.bat
arquivo dentro de um.bat
arquivo, use(Sim, isso é bobagem, faria mais sentido se você pudesse chamá-lo com
foo.bat
, como no prompt de comando, mas a maneira correta é usá-locall
.)fonte
Olhando para seus nomes de arquivos, você já pensou em usar uma ferramenta de construção como NAnt ou Ant (a versão Java). Você terá muito mais controle do que com arquivos bat.
fonte
Se você deseja abrir muitos arquivos em lotes de uma só vez, pode usar o comando call. No entanto, o comando call fecha o arquivo bat atual e vai para outro. Se você deseja abrir muitos de uma vez, tente o seguinte:
E assim por diante ou repita o início
cmd
"call
..." para muitos arquivos. Isso funciona no Windows 7 , mas não tenho certeza sobre outros sistemas.fonte
Se isso não funcionar, substitua
start
porcall
ou tente o seguinte:fonte
Basta usar o
call
comando! Aqui está um exemplo:fonte
Com a citação correta (às vezes pode ser complicado):
1 arg - Título (esvaziar neste caso)
2 arg - / especifica D diretório de partida, pode ser omitido se quer que o dir atual de trabalho (como "% ~ DP0")
3ª arg - comando para lançamento, "cmd.exe"
4 arg - argumentos para comando, com aspas dobradas para os argumentos contidos nele (é assim que você escapa aspas entre aspas em lote)
fonte
Executando vários scripts em um, tive o mesmo problema. Eu continuei morrendo no primeiro, sem perceber que estava saindo no primeiro script.
Eu removi todas as 11 linhas EXIT dos meus scripts e tentei novamente e todas as 11 foram executadas em ordem uma de cada vez na mesma janela de comando.
fonte
exit
, substitua-os porgoto :eof
. Isso "retornará" para ocall
@echo off :menu some commands goto menu
Observe que isso executará um loop contínuo até ser fechado. basicamente, você não precisa a::
apenas:
A seguir, resolvi meu problema:
fonte
Pode ser que você queira isso:
Execute os scripts em lote em paralelo
Aqui, três arquivos em lote são executados em janelas de comando separadas no estado minimizado. Se você não os quer minimizados, remova-os
/min
. Além disso, se você não precisar controlá-los mais tarde, poderá se livrar dos títulos. Portanto, um comando básico serástart cmd /k call systemLogCollector.bat
Se você deseja finalizá-los,
fonte