Isso acontece muito comigo com meus scripts de criação automatizados.
Eu acho que o motivo pode ser algum aplicativo que tenha um arquivo aberto nesse diretório com "share delete". Ou seja o aplicativo permite uma exclusão do arquivo (é por isso que eu acho que a chamada DeleteFile não falha), mas o arquivo só irá desaparecer depois que o aplicativo tiver fechado o seu identificador.
Isso significa que o arquivo ainda pode estar lá quando o comando rmdir
tentar excluir a pasta, daí a mensagem de erro. Logo depois disso, o aplicativo encerrará o manipulador, o arquivo desaparecerá e quando você inspecionar a pasta para ver qual arquivo rmdir
estava falando, estará vazio.
Pelo menos essa é a minha teoria.
A solução proposta por Harry Johnston parece boa. Somente eu inseriria uma pausa entre os comandos rmdir
. É claro que o Windows não possui um comando "pause" facilmente programável por script (correção: versões antigas do Windows não, mais recentes possuem - ver comentários). Mas, se a granularidade dos segundos for 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}