Problema con código en MSDOS

¿Alguien sabe por qué ERRORLEVEL me devuelve siempre 0 después de un MOVE con errores?

Supongamos que el directorio c:\prueba no existe, lanzo el siguiente CMD:

IF 1 == 1 (

MOVE c:\prueba.txt c:\prueba\

ECHO %ERRORLEVEL%

)



Al mostrar con ECHO el valor de ERRORLEVEL, me devuelve 0. Cuando debería devolver 1 (error al mover el fichero).

Curiosamente sí funciona fuera de la condición IF, pero yo necesito el código dentro de la condición.

Mil gracias.
Seguro que el operador que buscas es "=="?

Yo he visto por ahí esto:

IF string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

where compare-op may be one of:

EQU - equal
NEQ - not equal
LSS - less than
LEQ - less than or equal
GTR - greater than
GEQ - greater than or equal
Peklet escribió:Seguro que el operador que buscas es "=="?

Yo he visto por ahí esto:

IF string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

where compare-op may be one of:

EQU - equal
NEQ - not equal
LSS - less than
LEQ - less than or equal
GTR - greater than
GEQ - greater than or equal


Si, funciona == y también EQU.

Es muy fácil de comprobar desde la linea de comando de DOS.

El problema es ERRORLEVEL, que devuelve 0 (todo ok) cuando debería devolver 1 (error). Si lo metemos en cualquuer condición no funciona, si no le ponemos ninguna condición, funciona. No lo enitendo. :-?

Mira la captura:

Imagen

Primero me devuelve 0. Después 1. ¬_¬
El problema está en que el intérprete de comandos considera todo ese código como una sola línea. Como la expansión de variables se realiza línea a línea, el intérprete reemplaza el valor de %ERRORLEVEL% incluso antes de que se ejecuten los comandos que hay dentro del IF.

Más o menos el proceso que seguiría sería el siguiente:

1) Código inicial
IF 1 == 1 (

MOVE c:\prueba.txt c:\prueba\

ECHO %ERRORLEVEL%

)


2) Compresión en una sola línea

IF 1 == 1 (MOVE c:\prueba.txt c:\prueba\ && ECHO %ERRORLEVEL%)


3) Expansión de variables de entorno (suponiendo que el valor actual de %ERRORLEVEL% sea 0)

IF 1 == 1 (MOVE c:\prueba.txt c:\prueba\ && ECHO 0)


4) Ejecución

El sistema no puede encontrar la ruta especificada.
Se han movido         0 archivos.
0


Como ves, no importa cuál sea el resultado del comando MOVE, ya que el valor que se va a mostrar por pantalla queda definido de antemano.
Muchas gracias alsaan, me tiré toda la puta mañana en el trabajo con esta mierda. Le encontré otra solución, pero me quedé rallado con esto.

Al final puse el código de dentro de los IF en otro CMD y dentro de los IF llamé al script...

if 1 == 1 (
CALL codigo.cmd
)


Y dentro de codigo.cmd
move c:\prueba.txt c:\prueba\
echo %errorlevel%


Y el cabrón devuelve 1.
Reporto para que te lo muevan a PC ;)
y con lo facil que es poner
move /?
frankKM escribió:y con lo facil que es poner
move /?


O leerse la cuestión bien. ¿No?.

Porque no es un problema del comando MOVE. De hecho el comando MOVE es un ejemplo. Vale para cualquier comando de DOS que registre en ERRORLEVEL.
7 respuestas