windows batch-file post-build-event errorlevel prebuild

windows - ¿Cuál es la forma más fácil de restablecer ERRORLEVEL a cero?



batch-file post-build-event (10)

Agregue >nul después de cada comando que probablemente falle: esto parece impedir que la compilación falle.

Todavía puede verificar el resultado del comando examinando %errorlevel% .

Por ejemplo:

findstr "foo" c:/temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn''t find it)

Tengo un evento de creación posterior que ejecuta algunos comandos para el proyecto de CA. El último comando a veces causa que el valor ERRORLEVEL no sea igual a cero y luego falla la compilación.

Quiero añadir una línea de comando adicional para establecer siempre el valor ERRORLEVEL en cero. ¿Cuál es la forma más conveniente de hacer eso?


Descubrí que la "salida 0" parece ser una buena forma de lidiar con este problema.

Ejemplo de uso:

NET STOP UnderDevService / Y

salida 0

si el servicio UnderDevService no se inicia.


En un evento previo o posterior a la compilación, si el código de retorno de un archivo ejecutable es mayor que cero, y la llamada al ejecutable no es la última línea del evento previo o posterior a la compilación, se puede silenciar rápidamente y evitar desencadenar una comprobación para un nivel de errorlevel distinto de cero es seguir la línea que falla con una línea que devuelve explícitamente cero:

cmd /c "exit /b 0"

Esta es esencialmente una combinación genérica de las soluciones mencionadas anteriormente que funcionarán con algo más que la última línea de un evento previo o posterior a la construcción.


Estoy usando esto:

ping localhost -n 1> null


Parece funcionar:

ver > nul

No todo funciona, y no está claro por qué. Por ejemplo, los siguientes no:

echo. > nul cls > nul


Si se trata de un fragmento como "Evento posterior a la construcción", etc., estará bien anexando:

(...) || ver > nul

al final del último comando.

Alternativamente

cmd /c "exit /b 0"

es muy limpio y no idiomático: un lector que conozca el intérprete de comandos de Windows sabrá qué está pasando y cuál fue su intención.

Sin embargo, si está en un script por lotes, es posible que desee utilizar subrotines, que son un equivalente ligero del "script por lotes hijo" de la respuesta de akf.

Tener una subrutina:

:reset_error exit /b 0

y luego solo

call :reset_error

donde sea que lo necesite

Aquí hay un ejemplo completo:

@echo off rem *** main *** call :raise_error echo After :raise_error ERRORLEVEL = %ERRORLEVEL% call :empty echo After :empty ERRORLEVEL = %ERRORLEVEL% call :reset_error echo After :reset_error ERRORLEVEL = %ERRORLEVEL% :: this is needed at the end of the main body of the script goto:eof rem *** subroutines *** :empty goto:eof :raise_error exit /b 1 :reset_error exit /b 0

Qué salidas:

After :raise_error ERRORLEVEL = 1 After :empty ERRORLEVEL = 1 After :reset_error ERRORLEVEL = 0

Como ve, solo llama y regresa a través de goto: eof no es suficiente.


Yo personalmente uso esto:

cd .

Funciona incluso en el shell de Unix.

Pero, este podría ser un poco más rápido:

type nul>nul

Porque Process Monitor muestra QueryDirectory llamadas a QueryDirectory en cd .

PD: cd . tiene otro efecto secundario agradable en el shell de Unix. Restaura el directorio de trabajo recreado en la terminal si se ha abierto antes del borrado.


Yo siempre acabo de usar;

set ERRORLEVEL=0

Lo he estado usando durante años de burro.


Yo uso VERIFY o VERIFY > nul


si usa exit /b 0 puede devolver un errorlevel 0 desde dentro de un script por lotes hijo sin salir también del padre.