establecer ERRORLEVEL en 0

14

Tengo un archivo por lotes que es un contenedor alrededor de un instalador. Este archivo por lotes verifica el nivel de error devuelto por el instalador e imprime en consecuencia.

Noté que si ejecuto set ERRORLEVEL=0en un símbolo del sistema justo antes de iniciar el archivo por lotes (en la misma ventana de comando / entorno), el instalador nunca se mete con el nivel de error y mi script por lotes siempre regresa pasado. Supongo que %ERRORLEVEL%es una variable definida por Windows y se usa específicamente para imprimir errores de programas y scripts y que usar la variable en un archivo por lotes u otra cosa sería 'bajo su propio riesgo' porque podría cambiar en cualquier momento por otro proceso

Por lo que parece, cuando configuro el nivel de error en el entorno dado, de alguna manera termina el uso del nivel de error como titular del código de salida. ¿Alguien sabe a que se debe esto? Para mí es un comportamiento extraño e inesperado. ¡Cualquier información sobre el tema sería muy apreciada!

usuario972276
fuente

Respuestas:

14

Está redefiniendo la variable del sistema en una normal. Cuando haga esto, el sistema no lo usará hasta que se cierre la sesión de comando.

La mejor manera sería usar

exit /b 0

en otro archivo por lotes y llámelo desde su script principal. Donde el número 0 es tu deseado errorlevel. O eso, o use un comando que restablezca errorlevelpara usted, como echo, findtr, etc.

Por ejemplo, los siguientes comandos se establecerían ERRORLEVELen 0 dentro de su archivo por lotes:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
TwirlMandarin
fuente
2
Casi correcto. Puede hacer que el "sistema" use el ERRORLEVEL dinámico simplemente definiendo cualquier valor definido por el usuario usandoset "errorlevel="
dbenham el
¿Por qué Windows permite a alguien redefinir una variable del sistema en una normal? ¿Siguen existiendo ambas definiciones, su eco y otros comandos similares ahora apuntan a la normal? Entonces, ¿los programas podrían estar actualizando la variable del sistema, simplemente no es accesible a través del símbolo del sistema?
user972276
1
"O eso o use un comando que restablezca el nivel de error por usted, como echo, findtr, etc." El comando echo no restablece la variable de nivel de error.
antred
Como han dicho otros, si la errorlevel variable ha sido establecida "manualmente" por el usuario / lote con "set errorlevel=0", la errorlevelvariable ya no reflejará el código de salida, pero aún puede acceder al código de salida con if errorlevel do something.
Kevin Fegan
(1) Una pregunta más general es "¿Cómo configuro ERRORLEVEL en algún valor arbitrario, como 42?"  cmd /c exit 42 Parece ser la mejor respuesta a eso. (2) Como  señala dbenham , no necesita  /blas comillas ni las comillas.
Scott,
12

Nunca debe asignar su propio valor a variables dinámicas del sistema como ERRORLEVEL, PATH, CD, DATE, TIME, etc. Al hacerlo, evitará que el código vea el valor dinámico. Puede restaurar el valor dinámico simplemente indefiniendo el valor definido por el usuario. Por ejemplo:

set "errorlevel="

Si desea forzar el nivel de error a 0, a continuación, puede utilizar esta sintaxis totalmente no-intuitivo, pero muy eficaz: (call ). El espacio después de la llamada es crítico. Si desea establecer el nivel de error en 1, puede usarlo (call). Es crítico que no haya espacio después de la llamada.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Un método más intuitivo, pero menos conveniente para establecer el nivel de error es usar una subrutina dedicada en un archivo por lotes:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

O si está en la línea de comando, podría usar

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
dbenham
fuente
8

Yo personalmente uso esto:

cd .

Funciona incluso en unix shell.

Andry
fuente
Pero, este podría ser un poco más rápido: type nul>nulporque Process Monitor muestra QueryDirectoryllamadas en cd .PS: cd .tiene otro efecto secundario agradable en el shell de Unix. Restaura el directorio de trabajo recreado en el terminal si se ha abierto antes del borrado.
Andry
2

Aquí hay otras formas de restablecer el ErrorLevelestado, que incluso funcionan en MS-DOS (al 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 solo en MS-DOS:

command /? > nul

fc nul nul > nul

En aras de la integridad, esto establece el ErrorLevelestado en 1, válido tanto para Windows como para MS-DOS:

< nul find ""
aschipfl
fuente
1

Esto es lo único que he encontrado que funciona.

call (exit /b 0)

Lo necesitaba en un script que utiliza un script de terceros que detecta ERRORLEVEL, pero no restablece el nivel de error por sí solo.

Richard Meadows
fuente
0

Estos también funcionarán: (Establece el nivel de error en 1)

Método 1

color 00

Método 2

echo A | find "B"

También puede usar esto para establecer el nivel de error 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Wasif Hasan
fuente