ERRORLEVEL

Mantenido el

Cuando un archivo por lotes ejecuta varios comandos, es habitual querer detenerse si un comando anterior falla, o reaccionar de forma distinta según el error.

El símbolo del sistema expone el resultado de cada comando como ERRORLEVEL (código de salida). Con él puedes incorporar manejo de errores a tus archivos por lotes.

¿Qué es ERRORLEVEL?

ERRORLEVEL es un valor especial, gestionado automáticamente por el símbolo del sistema, que guarda el código de salida del último comando ejecutado. Puedes leerlo como %ERRORLEVEL%, igual que una variable de entorno.

ValorSignificado
0Éxito
1 o superiorError (salida anormal)
Sobre los valores de ERRORLEVEL

La mayoría de los comandos devuelven 0 si tienen éxito y 1 o más si fallan, pero el significado depende del comando. Por ejemplo, ROBOCOPY considera correctos los valores 0–7 (1 indica que se copiaron archivos, 2 que hay archivos adicionales, etc.) y error a partir de 8.

Cómo comprobar ERRORLEVEL

Método 1: referenciar %ERRORLEVEL%

copy "source.txt" "dest.txt"
echo Código de salida: %ERRORLEVEL%

Método 2: evaluar con IF ERRORLEVEL N

copy "source.txt" "dest.txt"
IF ERRORLEVEL 1 (
    echo Se produjo un error.
)
Nota sobre IF ERRORLEVEL

IF ERRORLEVEL N es verdadero cuando ERRORLEVEL es mayor o igual que N. Para comprobar un valor exacto, usa IF %ERRORLEVEL% EQU N.

Método 3: comprobación rápida con && y ||

copy "source.txt" "dest.txt" && echo Éxito || echo Fallo
OperadorSignificado
&&Se ejecuta si el comando anterior tuvo éxito (ERRORLEVEL=0)
||Se ejecuta si el comando anterior falló (ERRORLEVEL≠0)

Manejo básico de errores

Comprobar si un comando tuvo éxito

@echo off
setlocal

copy "important.txt" "backup\important.txt" >nul 2>&1

IF %ERRORLEVEL% EQU 0 (
    echo La copia se completó correctamente.
) ELSE (
    echo Error: la copia falló. (código de error: %ERRORLEVEL%)
)

endlocal

Detenerse ante un error

@echo off
setlocal

echo Paso 1: copiando el primer archivo...
copy "data.txt" "backup\data.txt" >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
    echo Error: falló el paso 1.
    GOTO :EOF
)

echo Paso 2: copiando el segundo archivo...
copy "data2.txt" "backup\data2.txt" >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
    echo Error: falló el paso 2.
    GOTO :EOF
)

echo Todos los pasos se completaron correctamente.
endlocal

Definir un código de salida personalizado

Añade un número a EXIT /B para establecer el código de salida del propio archivo por lotes.

@echo off
setlocal

IF NOT EXIST "config.ini" (
    echo Error: no se encontró el archivo de configuración.
    EXIT /B 1
)

IF NOT EXIST "data\" (
    echo Error: no se encontró la carpeta de datos.
    EXIT /B 2
)

echo Iniciando el proceso.
rem Aquí va el proceso...

echo Proceso finalizado.
EXIT /B 0

Quien llama puede ramificar según el valor devuelto.

@echo off
call custom_exit.cmd
IF %ERRORLEVEL% EQU 1 echo Falta el archivo de configuración.
IF %ERRORLEVEL% EQU 2 echo Falta la carpeta de datos.
IF %ERRORLEVEL% EQU 0 echo Finalizó correctamente.

Códigos de salida de las subrutinas

Una subrutina llamada con CALL :etiqueta también puede devolver un código de salida.

@echo off
setlocal

CALL :CHECK_FILE "config.ini"
IF %ERRORLEVEL% NEQ 0 (
    echo No se cumplen los requisitos previos. Se cancela el proceso.
    GOTO :EOF
)

echo Iniciando el proceso.
GOTO :EOF

:CHECK_FILE
IF NOT EXIST "%~1" (
    echo Error: no se encontró %~1.
    EXIT /B 1
)
echo OK: se encontró %~1.
EXIT /B 0

Ejemplo práctico: manejo de errores con registro

@echo off
setlocal

rem El formato de %DATE% depende de la configuración regional (aquí se supone yyyy/mm/dd)
set LOGFILE=C:\Logs\batch_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log

CALL :LOG "Iniciando el proceso."

copy "source\data.csv" "dest\data.csv" >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
    CALL :LOG "Error: no se pudo copiar data.csv."
    GOTO END
)
CALL :LOG "Se copió data.csv."

copy "source\config.ini" "dest\config.ini" >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
    CALL :LOG "Error: no se pudo copiar config.ini."
    GOTO END
)
CALL :LOG "Se copió config.ini."

CALL :LOG "Todos los pasos se completaron correctamente."

:END
endlocal
GOTO :EOF

:LOG
echo %DATE% %TIME% - %~1
echo %DATE% %TIME% - %~1 >> "%LOGFILE%"
EXIT /B
チェック

En archivos por lotes de producción, registrar el resultado de cada paso en un archivo de registro facilita mucho encontrar la causa cuando algo falla.

Errores comunes al usar ERRORLEVEL

Dentro de bloques puede hacer falta la expansión retardada

Dentro de un bloque entre paréntesis de IF o FOR, %ERRORLEVEL% se expande cuando se analiza el bloque. Para comprobar el resultado de un comando ejecutado dentro del bloque, usa IF ERRORLEVEL N o !ERRORLEVEL! con expansión retardada (consulta el artículo relacionado).

No asignes ERRORLEVEL con SET

Si asignas un valor con set ERRORLEVEL=0, %ERRORLEVEL% devolverá ese valor en lugar del código de salida real. Para restablecerlo, ejecuta un comando inocuo como cmd /c exit /b 0.

La fiabilidad del código de salida varía según el comando

Algunos comandos, como DEL, devuelven 0 aunque el archivo no exista. En operaciones importantes, verifica el resultado directamente con IF EXIST.

Códigos de salida de comandos habituales

ComandoÉxitoFallo / otros
copy01
xcopy01 (nada que copiar), 2 (Ctrl+C), 4 (error de inicialización), 5 (error de escritura en disco)
robocopy0–78 o superior
find01 (no se encontró la cadena), 2 (error)
ping01 (sin respuesta, etc.; puede ser 0 si un router responde “host de destino inaccesible”)

Resumen

OperaciónMétodo
Comprobar el código de salida%ERRORLEVEL%
Ramificar según éxito/falloIF %ERRORLEVEL% EQU 0
Evaluar si es N o mayorIF ERRORLEVEL N
Comprobación rápidacomando && si éxito || si fallo
Devolver un código personalizadoEXIT /B código

Artículos relacionados

Cuestionario

Problema de práctica

¿Qué afirmación describe correctamente la condición de IF ERRORLEVEL N?

回答がサーバーに送信されることはありません
#Símbolo del sistema #Archivo por lotes #ERRORLEVEL #Manejo de errores #Comando