¿Cuál es la forma más fácil de restablecer ERRORLEVEL a cero?
-
12-09-2019 - |
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?
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.