Eu tenho um arquivo em lotes que está chamando o mesmo executável repetidamente com parâmetros diferentes. Como faço para terminar imediatamente se uma das chamadas retornar um código de erro de qualquer nível?
Basicamente, quero o equivalente ao MSBuild ContinueOnError=false
.
batch-file
Josh Kodroff
fonte
fonte
Respostas:
Verifique a
errorlevel
em umaif
declaração, e depoisexit /b
(sair do b arquivo atch apenas, não o todo o processo cmd.exe) para outros fins que 0 valores.Se você deseja que o valor do nível de erro seja propagado para fora do seu arquivo em lotes
mas se isso estiver dentro de um
for
, fica um pouco complicado. Você precisará de algo mais como:Editar: você deve verificar o erro após cada comando. Não há tipo global de construção "em erro," no lote cmd.exe / command.com. Também atualizei meu código pelo CodeMonkey , embora nunca tenha encontrado um nível de erro negativo em nenhum dos meus hackers em lote no XP ou Vista.
fonte
neq
) ativadas / desativadas não importam no uso,if not errorlevel 1 exit /B
conforme explicado pela Microsoft no artigo de suporte Usando operadores de redirecionamento de comando e na saída de ajuda na execuçãoif /?
em uma janela cmd. O nível de erro atual (código de saída) é mantido ao sair do processamento do arquivo em lotes comexit /B
. Nota:exit
com o parâmetro/B
requer extensões de comando ativadas, consulte Para onde o GOTO: EOF retorna?Adicione
|| goto :label
a cada linha e defina a:label
.Por exemplo, crie este arquivo .cmd:
Consulte também a pergunta sobre como sair da sub-rotina de arquivos em lote .
fonte
command || (SET ErrorLine=102 && goto :error)
||
foi para isso que foi criado. Talvez não vá em particular, mas "tente, faça isso por erro", como Fowl mencionou. Minha pergunta é: isso funciona para todos os códigos de saída diferentes de zero? Apenas positivos?cmd /k exit -1 && echo success || echo fail
- as impressões falham.command || exit /b %errorlevel%
O mais curto:
Se precisar, você pode definir o código de saída:
E você também pode registrar:
fonte
%ERRORLEVEL%
é intocável quando você chamaexit /b
, de modo que o código de erro é encaminhadoUma atualização secundária, você deve alterar as verificações de "if errorlevel 1" para as seguintes ...
Isso ocorre porque no XP você pode obter números negativos como erros. 0 = sem problemas, qualquer outra coisa é um problema.
E lembre-se da maneira como o DOS lida com os testes "SE ERRORLEVEL". Ele retornará verdadeiro se o número que você está verificando for esse número ou mais alto; portanto, se você estiver procurando por números de erro específicos, precisará começar com 255 e diminuir o trabalho.
fonte
Aqui está um programa poliglota para o BASH e o Windows CMD que executa uma série de comandos e sai se algum deles falhar:
Eu usei esse tipo de coisa no passado para um script de integração contínua de várias plataformas .
fonte
Prefiro a forma de comando OR, pois as considero mais legíveis (em vez de ter um if após cada comando). No entanto, a maneira ingênua de fazer isso
command || exit /b %ERRORLEVEL%
está errada .Isso ocorre porque o lote expande variáveis quando uma linha é lida pela primeira vez, e não quando elas estão sendo usadas. Isso significa que, se a
command
linha acima falhar, o arquivo em lotes será encerrado corretamente, mas será encerrado com o código de retorno 0, porque é esse o valor de%ERRORLEVEL%
estava no início da linha. Obviamente, isso é indesejável em nosso script, portanto, precisamos ativar a expansão atrasada , assim:Esse trecho executará os comandos de 1 a 4 e, se algum deles falhar, será encerrado com o mesmo código de saída que o comando com falha.
fonte
Nem sempre podemos depender de ERRORLEVEL, porque muitas vezes programas externos ou scripts em lote não retornam códigos de saída.
Nesse caso, podemos usar verificações genéricas para falhas como esta:
E se o programa gerar algo para o console, podemos verificar também.
fonte
Não importa como tentei, o nível de erro sempre permanece 0, mesmo quando o msbuild falha. Então, eu criei minha solução alternativa:
Build Project e salve o log no Build.log
procure a string "0 Error" no log de construção, defina o resultado como var
obtém o último caractere, que indica quantas linhas contém a string de pesquisa
se a sequência não for encontrada, erro> 0, falha na compilação
Essa solução foi inspirada na postagem de Mechaflash em Como definir comandos de saída como uma variável em um arquivo em lotes
e https://ss64.com/nt/syntax-substring.html
fonte
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
. Nota:find "0 Error"
também encontrará10 Errors
.fonte