Como posso criar um arquivo em lote que deve executar o comando somente após a execução bem-sucedida do comando anterior?
Responder1
Depende do que você entende por sucesso. Se quiser verificar se foo.exe
não retornou nenhumcódigo de saídadiferente de 0, use:
@echo off
start /wait foo.exe
if errorlevel 0 (
start /wait bar.exe
)
para ser executado bar.exe
após foo.exe
o código de saída retornado 0
. Você pode omitir start /wait
se o aplicativo que você está testando for o console um e não o desktop.
Mais informações sobre isso:Como obtenho o código de saída do aplicativo em uma linha de comando do Windows?, em respostas deSamuel RenkerteGary.
Responder2
além da solução errorlevel postada por Hex e melhorada pelo comentário de Michael.
Este é ainda mais rápido para o que você deseja fazer.
primeiro comando && segundo comando
O segundo comando só será executado se o primeiro comando for bem-sucedido. ou seja, se o primeiro comando não retornou um erro.
No exemplo abaixo, dir asfsds retorna essa saída, mas também retorna um erro
Se você fizer dir asdfsss & blah então ele será executado blah independentemente de o primeiro comando (dir sdsdf) ter retornado um erro ou não.
Mas se você executá-los com && entre eles, se o primeiro for um erro, o segundo não será executado. É baseado na ideia da álgebra booleana. Se A for verdadeiro e B for verdadeiro, então A AND B é verdadeiro. Então, para descobrir se A e B são verdadeiros, você poderia verificar A e B, ou poderia ser "preguiçoso" ou eficiente, e apenas verificar um e se for falso você saberá que toda a expressão é falsa. E se for verdade, então você tem que verificar um ao outro. Portanto, A && B verifica A e só verifica B se tiver que verificar B, então só verifica B se B for verdadeiro. Mas esse conceito de álgebra booleana é aplicado aos comandos, então ele executa o primeiro, o primeiro pode retornar um erro ou não, e se o primeiro retornar um erro, ele não tentará executar e verificar o segundo, e se o primeiro não retornar erro então tentará o segundo. Sem dúvida, a própria expressão retornaria verdadeiro(sem erro) se ambos fossem verdadeiros e falso(erro) caso contrário.
C:\Users\user>dir asdfsdf
O volume na unidade C não tem rótulo. O número de série do volume é B411-D580Diretório de C:\Usuários\usuário
Arquivo não encontrado <---------------- Veja a saída do diretório asdfdsds acima
C:\Users\user>dir asdfsdf & echo a
O volume na unidade C não tem rótulo. O número de série do volume é B411-D580Diretório de C:\Usuários\usuário
Arquivo não encontrado a <--- veja o 'echo a' executado
C:\Users\user>dir asdfsdf && echo a
O volume na unidade C não tem rótulo. O número de série do volume é B411-D580Diretório de C:\Usuários\usuário
Arquivo não encontrado
C:\Usuários\usuário>
Se você fez dir filethatexists && echo a, verá que o primeiro comando é executado com êxito e, em seguida, echo a é executado. Da mesma forma echo a && echo b