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.