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=0
en 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!
fuente
&&
o||
.Respuestas:
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
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 restablezcaerrorlevel
para usted, como echo, findtr, etc.Por ejemplo, los siguientes comandos se establecerían
ERRORLEVEL
en 0 dentro de su archivo por lotes:fuente
set "errorlevel="
errorlevel
variable ha sido establecida "manualmente" por el usuario / lote con"set errorlevel=0"
, laerrorlevel
variable ya no reflejará el código de salida, pero aún puede acceder al código de salida conif errorlevel do something
.cmd /c exit 42
Parece ser la mejor respuesta a eso. (2) Como señala dbenham , no necesita/b
las comillas ni las comillas.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:
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.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:
O si está en la línea de comando, podría usar
fuente
Yo personalmente uso esto:
cd .
Funciona incluso en unix shell.
fuente
type nul>nul
porque Process Monitor muestraQueryDirectory
llamadas encd .
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.Aquí hay otras formas de restablecer el
ErrorLevel
estado, que incluso funcionan en MS-DOS (al menos para la versión 6.22):Los siguientes métodos funcionan solo en MS-DOS:
En aras de la integridad, esto establece el
ErrorLevel
estado en1
, válido tanto para Windows como para MS-DOS:fuente
Esto es lo único que he encontrado que funciona.
Lo necesitaba en un script que utiliza un script de terceros que detecta ERRORLEVEL, pero no restablece el nivel de error por sí solo.
fuente
Estos también funcionarán: (Establece el nivel de error en 1)
Método 1
Método 2
También puede usar esto para establecer el nivel de error 1-26:
fuente