Pregunta

Tengo un evento posterior a la generación que se ejecuta algunos comandos para un proyecto de C #. El último comando a veces hacer que el valor ERRORLEVEL no es igual a cero y luego falla la construcción.

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

¿Fue útil?

Solución 4

He encontrado que "exit 0" parece una buena manera de hacer frente a este problema.

Ejemplo de uso:

  

NET STOP UnderDevService / Y

     

exit 0

Si no se inicia el servicio UnderDevService.

Otros consejos

si utiliza exit /b 0 puede devolver un errorlevel 0 desde dentro de un script por lotes niño sin también de salir de la matriz.

Parece que hacer el truco:

ver > nul

No todo funciona, y no está claro por qué. Por ejemplo, lo siguiente no hacer:

echo. > nul
cls > nul

En un evento de pre o post-construcción, si el código de retorno de un ejecutable es mayor que cero, y la llamada al ejecutable no es la última línea de la prueba previa o posterior a la generación, una forma rápida de silencio y evitar la activación de un cheque por un no-cero errorlevel es seguir la línea de defecto con una línea que devuelve explícitamente cero:

cmd /c "exit /b 0"

Esto es esencialmente una combinación genérica de las soluciones mencionadas anteriormente, que trabajará con más de solo la última línea de un evento de pre o post-construcción.

Yo personalmente uso esto:

cd .

Funciona incluso en shell UNIX.

Sin embargo, éste podría ser un poco más rápido:

type nul>nul

Debido Process Monitor muestra las llamadas QueryDirectory en cd .

PS: cd . tiene otro efecto secundario agradable en el shell de UNIX. No restaurar directorio de trabajo recreado en el terminal si se ha abierto antes del borrado.

Yo uso VERIFY o VERIFY > nul

Si se trata de un fragmento como "posterior a la generación de eventos", etc., a continuación, se le multa anexar:

(...) || ver > nul

al final de la última orden.

Alternativamente

cmd /c "exit /b 0"

es muy limpio y no idiomática -. Un lector que sabe shell de Windows sabrá lo que está pasando, y lo que era su intención

Sin embargo, si estás en un archivo por lotes, es posible que desee utilizar subrotines, que son un equivalente de peso ligero de la "escritura de la hornada del niño" de la respuesta de AKF.

Tener una subrutina:

:reset_error
exit /b 0

y luego simplemente

call :reset_error

siempre 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

que da salida:

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

Como se puede ver - sólo llamar y volviendo a través de Goto: EF no es suficiente

Añadir >nul después de cada comando que es probable que falle - esto parece prevenir la acumulación de la quiebra.

Aún puede comprobar el resultado del comando mediante el examen de %errorlevel%.

Por ejemplo:

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

Aquí están algunas otras formas de restablecer el estado ErrorLevel, que aún funciona en MS-DOS (por lo menos para la versión 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Los siguientes métodos funcionan en MS-DOS solamente:

command /? > nul

fc nul nul > nul

En aras de la exhaustividad, esto establece el estado ErrorLevel a 1, válido tanto para Windows y MS-DOS:

< nul find ""

Estoy usando esto:

ping localhost -n 1> nula

Siempre acabo de utilizar;

set ERRORLEVEL=0

He estado usando durante años de burro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top