“Rd” sale con errorlevel establecido en 0 en el error cuando falla la eliminación, etc.

Estoy escribiendo un script por lotes (.bat) y necesito manejar el caso en el que falla la eliminación de una carpeta. Estoy usando %errorlevel% para capturar el código de salida, pero en el caso del comando rd parece que no funciona:

 C:\Users\edo\Desktop>rd testdir Directory is not empty C:\Users\edo\Desktop>echo %errorlevel% 0 

¿Por qué? ¿Que sugieres?

¡Vaya, este es el segundo caso que he visto donde ERRORLEVEL no está configurado correctamente! Consulte Redirección de archivos en Windows y% errorlevel% .

La solución es la misma que para detectar fallas de redirección. Usa el || operador para actuar en caso de falla.

 rd testdir || echo The command failed! 

Lo extraño es que cuando usas el || operador, el ERRORLEVEL se establece correctamente en 145 si la carpeta no estaba vacía, o 2 si la carpeta no existía. Entonces ni siquiera necesitas hacer nada. Podría “ejecutar” condicionalmente una observación, y el nivel de error se establecerá correctamente.

 rd testdir || rem echo %errorlevel% 

Actualización 2016-01-21

En abril de 2015, Andreas Vergison afirmó en un comentario que || no configuró ERRORLEVEL para los errores “Acceso denegado” o “… En uso …”. Tenía Windows 7 en ese momento, y no creo que haya verificado su reclamo, pero simplemente asumí que estaba en lo cierto. Pero recientemente probé en Windows 10, y || siempre establece el ERRORLEVEL en un valor distinto de cero cuando se produce un error. Tenga en cuenta que (call ) es una forma arcana de forzar el ERRORLEVEL a 0 antes de ejecutar cada comando. También tenga en cuenta que mi sesión cmd.exe ha retrasado la expansión habilitada.

 C:\test>(call ) & rd junk && echo OK || echo ERROR !errorlevel! Access is denied. ERROR 5 C:\test>(call ) & rd test && echo OK || echo ERROR !errorlevel! The directory is not empty. ERROR 145 C:\test>(call ) & rd \test && echo OK || echo ERROR !errorlevel! The process cannot access the file because it is being used by another process. ERROR 32 C:\test>(call ) & rd notExists && echo OK || echo ERROR !errorlevel! The system cannot find the file specified. ERROR 2 

rd no establece errorlevel en cero – deja errorlevel intacto: fe si la operación anterior finaliza en positivelevel positivo y rd termina con éxito, deja el errorlevel sin cambios. Ejemplo: los niveles de error de robocopy por debajo de 4 son advertencias y no errores y se pueden ignorar, por lo que el siguiente código puede terminar con un error incluso cuando el directorio se eliminó con éxito:

 robocopy ... if errorlevel 4 goto :error rd somedir if errorlevel 1 goto :error 

Solución: ignore el error y verifique si el directorio aún existe después de rd :

 rd somedir if exist somedir goto :error