Esto me pasa mucho con mis scripts de construcción automatizada.
Supongo que la razón podría ser alguna aplicación que tiene un archivo abierto en ese directorio con “share delete”. Es decir, la aplicación permite la eliminación del archivo (por lo que me imagino que la llamada DeleteFile no falla), pero el archivo sólo desaparecerá después de que dicha aplicación haya cerrado su “handle”.
Eso significa que el archivo podría seguir estando ahí cuando el comando rmdir
intente eliminar la carpeta, de ahí el mensaje de error. Poco después, dicha aplicación cerrará su “handle”, el archivo desaparecerá, y cuando inspeccione la carpeta para ver de qué archivo rmdir
estaba hablando, estará vacía.
Al menos esa es mi teoría.
La solución propuesta por Harry Johnston se ve bien. Sólo que yo insertaría una pausa entre los comandos rmdir
. Por supuesto que Windows no tiene un comando de “pausa” fácilmente programable (corrección: las antiguas versiones de Windows no lo tienen, las más recientes sí - ver comentarios). Pero si la granularidad de los segundos es suficiente, se puede usar ping
para crear una pausa:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Así que en total:
rd /s /q foo
:: retry once
if exist foo (
:: clear errorlevel
cmd /c
:: pause
ping -n 2 127.0.0.1 >nul
:: retry
rd /s /q foo
)
:: retry yet again
if exist foo (
cmd /c
ping -n 2 127.0.0.1 >nul
rd /s /q foo
)
:: give up
if exist foo {panic}