2009-07-11 6 views
50

Tengo un evento de creación posterior que ejecuta algunos comandos para un proyecto de C#. El último comando a veces causa que el valor ERRORLEVEL no sea igual a cero y luego falla la compilación.¿Cuál es la forma más fácil de restablecer ERRORLEVEL a cero?

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?

+0

La acumulación en realidad no fallan, sólo el IDE lo parece. – Dykam

+8

Me doy cuenta de que esta es una publicación muy antigua ... Logré restablecer el nivel de error a 0 emitiendo el comando "escribir nul" después del último comando. Solo sentí que podría ser de utilidad. – Arun

Respuesta

15

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

Ejemplo de uso:

NET STOP UnderDevService/Y

salida 0

si no se inicia el servicio UnderDevService.

+4

no si también desea ejecutar ese archivo por lotes desde la línea de comando, ya que la salida 0 cerrará la ventana. cmd/c "exit/b 0" como se sugiere a continuación es mucho más benigno – madoki

42

parece hacer el truco:

ver > nul 

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

echo. > nul 
cls > nul 
+9

Creo que la razón de por qué "echo" y "cls" no funcionan es porque son los comandos integrados del shell, no los programas reales. – user95319

+1

Te daré eso, pero ¿dónde está ver.exe? –

+0

No puedo encontrar "ver.exe" o "ver.com" tampoco. No sé cómo explicar eso. – user95319

56

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

+4

De todas las soluciones propuestas, esta probablemente sea la mejor. Voy a lanzar esta línea a un script * resetErrorlevel.bat *. En general, el hecho de que uno tenga que hacer algo tan trivial como borrar el nivel de error de un script es una prueba más de que el inventor de la programación por lotes de Windows debe ser perseguido y castigado con dureza. ;) – antred

23

En un evento previo o posterior a la construcció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 creación, de una manera rápida silenciar 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 anteriormente mencionadas que trabajarán con más de solo la última línea de un evento anterior o posterior a la compilación.

+0

gracias, esto funcionó para mí. la sugerencia de sonido más fácil de 'exit 0' anterior no se corta, ya que deseo continuar haciendo cosas después de restablecer el nivel de error, no salir – madoki

+3

aún más elegante: puede usar ' || cmd/c "exit/b 0" 'como un único liner. – Kupiakos

+0

Me gusta este método para *** configurar *** un arbitrario errorlevel como: 'cmd/c" exit/b 9009 "', pero parece un poco exagerado para establecerlo en 0. No lo haría 'ver> nul' (un comando interno), funciona igual de bien con menos sobrecarga que cargando otra copia del shell de comandos con 'cmd/c" exit/b 0 "'? –

0

Agregue >nul después de cada comando que probablemente fallará, 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) 
+1

Esto no funcionará: el shell evalúa toda la línea de comando a la vez, por lo que% errorlevel% será sustituido antes de que se ejecute el comando "findstr". Utilice "if errorlevel 1" en su lugar para probar un nivel de error distinto de cero. – UweBaemayr

+1

Probablemente su servidor CI falle las compilaciones si, por ejemplo, encuentra la cadena "error" en la salida estándar/error estándar. No estás restableciendo el estado. Estás silenciando el comando. Para un silencio más profundo usa> nul 2> nul –

5

utilizo VERIFY o VERIFY > nul

-3

Siempre acabo de utilizar;

set ERRORLEVEL=0 

Lo he estado usando durante años de burro.

+22

Es fácil pero es una muy mala idea, ya que crea una variable llamada 'errorlevel' que se superpone a la pseudovariable interna' errorlevel' – jeb

+4

Crikey, ¡tienes razón! Wow, parece que he estado esquivando balas durante años :) – cirrus

+1

Lo mismo aquí Cirrus! gracias jeb! – PsychoData

0

estoy usando esto:

de ping localhost -n 1> nula

+2

También es popular como comando de suspensión, cuando n> 1. –

1

Si se trata de un fragmento como "posterior a la generación de eventos", etc., entonces estará bien agregar:

(...) || ver > nul 

al final del último comando.

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á en una secuencia de comandos por lotes, es posible que desee utilizar subrotines, que son un equivalente ligero del "script por lotes hijo" de la respuesta de akf.

Tener un subprograma:

:reset_error 
exit /b 0 

y luego simplemente

call :reset_error 

siempre que lo necesite.

Aquí está 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.

1

Yo personalmente uso esto:

cd .

funciona incluso en el shell de Unix.

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

type nul>nul

Debido Process Monitor muestra QueryDirectory llamadas en cd .

Cuestiones relacionadas