¡Guau, este es el segundo caso que he visto donde ERRORLEVEL no está configurado correctamente! Ver File redirection in Windows and %errorlevel%.
La solución es la misma que para detectar fallas de redirección. Use el operador ||
para tomar medidas en caso de falla.
rd testdir || echo The command failed!
Lo extraño es que, cuando se utiliza el operador ||
, ERRORLEVEL se establece a continuación correctamente a 145 si la carpeta no estaba vacía, o 2 si no existe la carpeta. 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 21/01/2016
Ya en abril de 2015, Andreas Vergison reivindican en un comentario que ||
no ha ajustado el ERRORLEVEL de "Acceso denegado", o" ... En Use ... "errores. 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 el ||
siempre establece el ERRORLEVEL en un valor distinto de cero por 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
Bueno, eso funcionó. Supongo que el problema está relacionado con '% errorlevel%' y no tiene nada que ver con 'rd'. Creo que debería volver a escribir mis manejos de error usando esta estructura para un comportamiento más determinista. ¡Gracias! – etuardu
Esto funciona bien para los códigos 2 y 145, pero en el caso de "Acceso denegado" o "El proceso no puede acceder al archivo porque está siendo utilizado por otro proceso", simplemente deja ERRORLEVEL sin cambios. :( –
@AndreasVergison - ¡Gracias! Actualicé mi respuesta con su información. – dbenham