batch file - ver - ¿Qué comandos internos de cmd.exe borran el ERRORLEVEL a 0 en caso de éxito?
sintaxis de comandos cmd (2)
Su descripción del comando
CALL
está incompleta:
CALL: borra ERRORLEVEL si el comando CALLed no lo establece de otra manera. Ejemplo:
call echo OK
.
Mira este pequeño ejemplo:
@echo off
call :setTwo
echo Set two: %errorlevel%
call :preserve
echo Preserve: %errorlevel%
call echo Reset
echo Reset: %errorlevel%
call :subNotExists 2> NUL
echo Sub not exist: %errorlevel%
goto :EOF
:setTwo
exit /B 2
:preserve
echo Preserve
exit /B
Salida:
Set two: 2
Preserve
Preserve: 2
Reset
Reset: 0
Sub not exist: 1
CALL
descripción de la
CALL
debería decir algo como esto:
-
CALL: borra ERRORLEVEL si el comando CALLed no lo establece de otra manera.
Ejemplo:
call echo OK
, pero si el comando llamado es una subrutina, conserva el ERRORLEVEL anterior. Si la subrutina llamada no existe, establece ERRORLEVEL en 1.
Un método frecuente para manejar errores dentro de los scripts por lotes de Windows es usar cosas como
if errorlevel 1 ...
o
if %errorlevel% neq 0 ...
Muchas veces uno quiere que el código de manejo de errores conserve el ERRORLEVEL.
Creo que todos los comandos externos siempre darán como resultado que ERRORLEVEL se establezca en algún valor, por lo que el código de manejo de errores debe preservar ERRORLEVEL en una variable de entorno antes de ejecutar un comando externo.
¿Pero qué hay de los comandos internos? El problema es que algunos comandos internos borran el ERRORLEVEL a 0 cuando tienen éxito, y otros no. Y no puedo encontrar ninguna documentación que especifique qué comandos hacen qué.
Entonces la pregunta es, ¿ qué comandos internos borran el ERRORLEVEL a 0 en caso de éxito? Esta no es una pregunta general sobre los códigos ERRORLEVEL devueltos, sino estrictamente sobre los resultados de éxito.
Hay publicaciones como ¿Cuál es la forma más fácil de restablecer ERRORLEVEL a cero? y archivos por lotes de Windows: .bat vs .cmd? que dan respuestas parciales Pero nunca he visto una lista completa.
Nota: He tenido curiosidad por esto durante años. Así que finalmente decidí hacer un montón de experimentos y llegar a una respuesta definitiva. Estoy publicando estas preguntas y respuestas para compartir lo que he encontrado.
Esta respuesta se basa en experimentos que ejecuté en Windows 10. Dudo que haya diferencias con las versiones anteriores de Windows que usan cmd.exe, pero es posible.
También tenga en cuenta: esta respuesta no intenta documentar el resultado de ERRORLEVEL cuando un comando interno encuentra un error (a excepción de un pequeño error relacionado con DEL y ERASE)
No solo hay diferencias entre los comandos, sino que un solo comando puede comportarse de manera diferente dependiendo de si se ejecutó desde la línea de comandos, o dentro de un script por lotes con una extensión
.bat
, o desde dentro de un script por lotes con una extensión
.cmd
.
El siguiente conjunto de comandos nunca borra el ERRORLEVEL a 0 en caso de éxito, independientemente del contexto, sino que conserva el ERRORLEVEL anterior:
- ROTURA
- CLS
- ECO
- ENDLOCAL
- FOR: Obviamente, los comandos en la cláusula DO pueden establecer el ERRORLEVEL, pero un FOR exitoso con al menos una iteración no establece el ERRORLEVEL en 0 por sí solo.
- IR
- IF: Obviamente, los comandos ejecutados por IF pueden establecer ERRORLEVEL, pero un IF exitoso no establece ERRORLEVEL en 0 por sí solo.
- LLAVES
- PAUSA
- POPD
- RD
- movimiento rápido del ojo
- RMDIR
- CAMBIO
- COMIENZO
- TÍTULO
El siguiente conjunto de comandos siempre borra el ERRORLEVEL a 0 en caso de éxito, independientemente del contexto:
- discos compactos
- CHDIR
- COLOR
- DUPDO
- FECHA
- DEL: siempre borra ERRORLEVEL, incluso si el DEL falla (excepto cuando se ejecuta sin ningún argumento de archivo) .
- DIR
- ERASE: siempre borra ERRORLEVEL, incluso si ERASE falla. (excepto cuando se ejecuta sin ningún argumento de archivo) .
- Maryland
- MKDIR
- MKLINK
- MOVIMIENTO
- PUSHD
- REN
- REBAUTIZAR
- SETLOCAL
- HORA
- TIPO
- VER
- VERIFICAR
- VOL
Luego están estos comandos que no borran ERRORLEVEL en caso de éxito si se emiten desde la línea de comandos o dentro de un script con una extensión
.bat
, pero borran ERRORLEVEL a 0 si se emiten desde un script con una extensión
.cmd
.
Consulte
https://.com/a/148991/1012053
y
https://groups.google.com/forum/#!msg/microsoft.public.win2000.cmdprompt.admin/XHeUq8oe2wk/LIEViGNmkK0J
para obtener más información.
- ASSOC
- DPATH
- FTYPE
- CAMINO
- RÁPIDO
- CONJUNTO
Por último, existen estos comandos que no encajan perfectamente en ninguna de las categorías anteriores:
-
CALL: si un script de rutina o lote se llama, entonces ERRORLEVEL está controlado exclusivamente por el script CALLed o: rutina. Pero cualquier otro tipo de LLAMADA exitosa a un comando siempre borrará ERRORLEVEL a 0 si el comando LLAMADA no lo establece de otra manera.
Ejemplo:call echo OK
. -
SALIR: Si se usa sin
/B
, la sesión cmd.exe finaliza y no hay más ERRORLEVEL, solo el código de retorno cmd.exe. ObviamenteEXIT /B 0
borra el ERRORLEVEL a 0, peroEXIT /B
sin un valor conserva el ERRORLEVEL anterior.
Creo que eso explica todos los comandos internos, a menos que haya un comando indocumentado que me haya perdido.