Ir ao conteúdo

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


Ir à solução Resolvido por ricardo_br,

Posts recomendados

Postado

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!
Postado

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
Postado

@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!

Postado

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

 

Postado
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.

  • Solução
Postado

@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
Postado
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á.

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!