Tengo un archivo por lotes que llama al mismo ejecutable una y otra vez con diferentes parámetros. ¿Cómo hago que termine de inmediato si una de las llamadas devuelve un código de error de cualquier nivel?
Básicamente, quiero el equivalente de MSBuild ContinueOnError=false
.
batch-file
Josh Kodroff
fuente
fuente
Respuestas:
Verifique
errorlevel
en unaif
declaración y luegoexit /b
(salga solo del archivo b atch, no del proceso cmd.exe completo) para valores distintos de 0.Si desea que el valor del nivel de error se propague fuera de su archivo por lotes
pero si esto está dentro de un
for
se vuelve un poco complicado. Necesitarás algo más como:Editar: debe verificar el error después de cada comando. No existe un tipo de construcción global "en caso de error" en cmd.exe / command.com por lotes. También actualicé mi código por CodeMonkey , aunque nunca me encontré con un nivel de error negativo en ninguno de mis ataques por lotes en XP o Vista.
fuente
neq
) habilitadas / deshabilitadas no importan en el uso,if not errorlevel 1 exit /B
como lo explica Microsoft en el artículo de soporte Uso de operadores de redirección de comandos y en la salida de ayuda al ejecutarseif /?
en una ventana cmd. El nivel de error actual (código de salida) se mantiene al salir del procesamiento del archivo por lotes conexit /B
. Nota:exit
con el parámetro/B
requiere extensiones de comando habilitadas, consulte ¿A dónde vuelve GOTO: EOF?Agregue
|| goto :label
a cada línea y luego defina a:label
.Por ejemplo, cree este archivo .cmd:
Consulte también la pregunta sobre cómo salir de la subrutina de archivo por lotes .
fuente
command || (SET ErrorLine=102 && goto :error)
||
se creó en primer lugar. Tal vez no vaya a en particular, pero "intente, haga esto por error" como mencionó Fowl. Mi pregunta es si esto funciona para todos los códigos de salida distintos de cero. Positivos solamente?cmd /k exit -1 && echo success || echo fail
- las impresiones fallan.command || exit /b %errorlevel%
El más corto:
Si lo necesita, puede configurar el código de salida:
Y también puedes iniciar sesión:
fuente
%ERRORLEVEL%
no se toca cuando llamaexit /b
, por lo que se reenvía el código de errorUna actualización menor, debe cambiar las comprobaciones de "if errorlevel 1" a lo siguiente ...
Esto se debe a que en XP puedes obtener números negativos como errores. 0 = sin problemas, cualquier otra cosa es un problema.
Y tenga en cuenta la forma en que DOS maneja las pruebas "IF ERRORLEVEL" Volverá a ser verdadero si el número que está buscando es ese número o superior, por lo que si está buscando números de error específicos, debe comenzar con 255 y trabajar hacia abajo.
fuente
Aquí hay un programa políglota para BASH y Windows CMD que ejecuta una serie de comandos y se cierra si alguno de ellos falla:
He usado este tipo de cosas en el pasado para un script de integración continua de múltiples plataformas .
fuente
Prefiero la forma OR de comando, ya que los encuentro más legibles (en lugar de tener un if después de cada comando). Sin embargo, la forma ingenua de hacer esto
command || exit /b %ERRORLEVEL%
está mal .Esto se debe a que el lote expande las variables cuando se lee una línea por primera vez, en lugar de cuando se están utilizando. Esto significa que si
command
falla la línea de arriba, el archivo por lotes sale correctamente, pero sale con el código de retorno 0, porque ese es el valor de%ERRORLEVEL%
al comienzo de la línea. Obviamente, esto no es deseable en nuestro script, por lo que debemos habilitar la expansión retrasada , así:Este fragmento ejecutará los comandos 1-4, y si alguno de ellos falla, saldrá con el mismo código de salida que el comando que falló.
fuente
No siempre podemos depender de ERRORLEVEL, porque muchas veces los programas externos o los scripts por lotes no devuelven códigos de salida.
En ese caso, podemos usar verificaciones genéricas para fallas como esta:
Y si el programa genera algo para consolar, también podemos verificarlo.
fuente
No importa cómo lo intenté, el nivel de error siempre permanece en 0 incluso cuando msbuild falló. Entonces construí mi solución:
Compilar proyecto y guardar registro en Build.log
busque la cadena "0 Error" en el registro de compilación, establezca el resultado en var
obtener el último carácter, que indica cuántas líneas contiene la cadena de búsqueda
si no se encuentra la cadena, entonces error> 0, falla la compilación
Esa solución se inspiró en la publicación de Mechaflash en Cómo configurar la salida de comandos como una variable en un archivo por lotes
y https://ss64.com/nt/syntax-substring.html
fuente
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
. Nota:find "0 Error"
también encontrará10 Errors
.fuente