Ir ao conteúdo
  • Cadastre-se

Bat Como repetir um comando via BAT até que ele tenha sucesso?


Ir à solução Resolvido por ricardo_br,

Posts recomendados

Boa noite a todos!

Então galera, eu to precisando de uma ajuda aqui.
Infelizmente eu não posso colocar o código do batch aqui, pois é um código privado e eu teria sérios problemas com isso.

Estou executando um arquivo em lote, são mais de 3 mil linhas, todas são iguais, exceto em seus códigos.
Quando eu executo o batch, funciona normalmente sem problema, mas em algumas linhas dá erro, então automaticamente essa linha é ignorada pelo script e ele pula para o próximo comando/linha. Eu não quero que o comando que deu erro seja ignorado e passe para o próximo, quero que ele se repita, até que dê sucesso, dando sucesso ai sim passa para o próximo comando, isso até o final do script.

Eu consegui isso com esses 2 códigos abaixo, mas eles só fazem o que preciso quando nenhum comando falha. Se der sucesso o script segue com o próximo comando. Se houver falha, o script reinicia completamente. Ambos os códigos fazem a mesma coisa. Alguém sabe um jeito de fazer com que somente a linha que deu erro se repita até funcionar?

:Loop
MEU COMANDO AQUI | find "TTL="
if %errorlevel% neq 0 goto :Loop
echo Connection established

:repeat
MEU COMANDO AQUI || goto :repeat
echo Success!
Link para o comentário
Compartilhar em outros sites

O segundo código dá pra ignorar porque ele nem tem tratamento de erro né... então não vai te ajudar.

 

Mas como está tratando cada uma das 3000 linhas? Assim?

 

:Loop1

MEU COMANDO AQUI para a linha 1 | find "TTL="

if %errorlevel% neq 0 goto :Loop1

echo Connection 1 established

 

:Loop2

MEU COMANDO AQUI para a linha 2 | find "TTL="

if %errorlevel% neq 0 goto :Loop2

echo Connection 2 established

 

É isso?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@ricardo_br@W46n3r Peço mil desculpas, isso está esquentando tanto minha mente que eu acabei errando, acho que coloquei o código de uma forma errada e ele estava saltando o erro e não repetindo o comando, não faço ideia do que eu fiz, então copiei o código todo de novo, e inseri no bat.

Bom, refiz o teste, o loop funcionou, só que ficou em loop infinito, repetindo o primeiro comando. Existe alguma forma de evitar esse loop infinito, para que o script continue executando as próximas linhas?

@W46n3rNão adicionei todas as linhas, testei apenas em 6, um comando abaixo do outro, da mesma forma que você demonstrou ai.

Algum moderador, pode por favor, liberar a opção de edição para que eu corrija o texto?
Obrigado!

Link para o comentário
Compartilhar em outros sites

Esse código tenta executar o comando por 5x, espera 5 segundos entre cada tentativa, se falhar por 5x exibe mensagem de erro na tela por 5 segundos e continua o código, se não houver erro o código continua instantaneamente...

 

https://pastebin.com/raw/2auRZAuT

 

@echo off
set Contador=1
:Loop7
cls
echo Tentativa %Contador% de ping em SuperPC
ping -n 3 -w 1 SuperPC 2>&1>Nul
if not %errorlevel% EQU 0 if %Contador% LSS 5 (
                                              set /a Contador+=1
                                              timeout /t 5 2>&1>nul
                                              goto :Loop7
                                             ) else (
                                                     echo  Infelizmente o comando Ping falhou
                                                     timeout /t 5 2>&1>nul
                                                    )
set Contador=1
:: aqui continua o código

 

Link para o comentário
Compartilhar em outros sites

12 horas atrás, ricardo_br disse:

Esse código tenta executar o comando por 5x, espera 5 segundos entre cada tentativa, se falhar por 5x exibe mensagem de erro na tela por 5 segundos e continua o código, se não houver erro o código continua instantaneamente...

 

https://pastebin.com/raw/2auRZAuT

 

@echo off
set Contador=1
:Loop7
cls
echo Tentativa %Contador% de ping em SuperPC
ping -n 3 -w 1 SuperPC 2>&1>Nul
if not %errorlevel% EQU 0 if %Contador% LSS 5 (
                                              set /a Contador+=1
                                              timeout /t 5 2>&1>nul
                                              goto :Loop7
                                             ) else (
                                                     echo  Infelizmente o comando Ping falhou
                                                     timeout /t 5 2>&1>nul
                                                    )
set Contador=1
:: aqui continua o código

 

Funcionou com 1 comando, como faço para funcionar com mais? tentei colocar o mesmo código abaixo do primeiro, e com outra linha de comando, mas não deu certo. Quando o primeiro comando deu erro, ele saltou para o segundo, e quando deu erro no segundo comando, o script encerrou.

Link para o comentário
Compartilhar em outros sites

  • Solução

@Jonathas Douglas É só fazer um loop para cada comando e não esquecer de resetar o contador para 1 antes de cada comando...

 

set Contador=1

:Loop1

comando1

......

set Contador=1

:Loop2

comando2

....

set Contador=1

:Loop3

comando3

....

set Contador=1

:Loop4

comando4

....

 

Outra opção que eu acho interessante seria criar um log de erros para você poder ver quais comandos deram erro:

 

comando1 || echo %date% %Time:~0,8% comando1 falhou >>"Erros.log"

comando2 || echo %date% %Time:~0,8% comando2 falhou >>"Erros.log"

comando2 || echo %date% %Time:~0,8% comando3 falhou >>"Erros.log"

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 29/11/2022 às 03:19, ricardo_br disse:

@Jonathas Douglas É só fazer um loop para cada comando e não esquecer de resetar o contador para 1 antes de cada comando...

 

set Contador=1

:Loop1

comando1

......

set Contador=1

:Loop2

comando2

....

set Contador=1

:Loop3

comando3

....

set Contador=1

:Loop4

comando4

....

 

Outra opção que eu acho interessante seria criar um log de erros para você poder ver quais comandos deram erro:

 

comando1 || echo %date% %Time:~0,8% comando1 falhou >>"Erros.log"

comando2 || echo %date% %Time:~0,8% comando2 falhou >>"Erros.log"

comando2 || echo %date% %Time:~0,8% comando3 falhou >>"Erros.log"

Funcionou! Muito obrigado!
Agora estou com outro problema...
Eu fiz assim, testei com 10 linhas, e funcionou perfeitamente. Claro eu nomeei os loops corretamente.

set Contador=1
:Loop_1
cls
echo Tentativa %Contador% teste
COMANDO AQUI
if not %errorlevel% EQU 0 if %Contador% LSS 5 (
set /a Contador+=1
timeout /t 5 2>&1>nul
goto :Loop_1
) else (
echo Infelizmente o comando falhou
timeout /t 5 2>&1>nul
)
::
set Contador=1
:Loop_2
cls
echo Tentativa %Contador% teste
COMANDO AQUI
if not %errorlevel% EQU 0 if %Contador% LSS 5 (
set /a Contador+=1
timeout /t 5 2>&1>nul
goto :Loop_2
) else (
echo Infelizmente o comando falhou
timeout /t 5 2>&1>nul
)
::

O problema é que são mais de 1000 linhas, numerar em ordem (:Loop_1 :Loop_2 :Loop_3 etc.) tantas linhas manualmente, é complicado. Sabe se tem algum jeito de fazer isso de forma automática? Agora meu único problema é esse. Eu tentei pelo Excel com a substituição, mas não obtive sucesso, ele renomeia em ordem apenas se as linhas estiverem exatamente uma abaixo da outra, mas não faz o mesmo da maneira que o código está.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!