Isto acontece-me muito com os meus scripts de construção automática.
Acho que a razão pode ser alguma aplicação que tem um ficheiro aberto nesse directório com “partilhar apagar”. Isto é, a aplicação permite a eliminação do ficheiro (e é por isso que eu imagino que a chamada DeleteFile não falha), mas o ficheiro só desaparecerá depois de a referida aplicação ter fechado o seu handle.
Isso significa que o ficheiro pode ainda lá estar quando o comando rmdir
tenta eliminar a pasta, daí a mensagem de erro. Pouco depois, a referida aplicação fechará o seu handle, o ficheiro desaparecerá, e quando se inspecciona a pasta para ver que ficheiro rmdir
estava a falar sobre ele estará vazio.
Pelo menos é essa a minha teoria.
A solução proposta por Harry Johnston parece boa. Só que eu inseriria uma pausa entre os comandos do rmdir
. Claro que o Windows não tem um comando de “pausa” facilmente scriptable (correcção: as versões antigas do Windows não têm, as mais recentes têm - ver comentários). Mas se a granularidade dos segundos é suficiente, pode-se usar ping
para criar uma pausa:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Então no 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}