Cela m'arrive souvent avec mes scripts de construction automatisés.
Je suppose que la raison pourrait être une application qui a un fichier ouvert dans ce répertoire avec “share delete”. C'est-à-dire que l'application permet de supprimer le fichier (c'est pourquoi je pense que l'appel à DeleteFile n'échoue pas), mais le fichier ne disparaîtra qu'après que ladite application ait fermé son gestionnaire.
Cela signifie que le fichier peut toujours être là lorsque la commande rmdir
essaie de supprimer le dossier, d'où le message d'erreur. Peu après, l'application en question fermera son gestionnaire, le fichier disparaîtra et lorsque vous inspecterez le dossier pour voir de quel fichier rmdir
il s'agit, il sera vide.
Du moins, c'est ma théorie.
La solution proposée par Harry Johnston semble bonne. Seulement, j'insérerais une pause entre les commandes de rmdir
. Bien sûr, Windows n'a pas de commande “pause” facilement scriptable (correction : les anciennes versions de Windows n'en ont pas, les plus récentes en ont - voir les commentaires). Mais si la granularité des secondes est suffisante, on peut utiliser ping
pour créer une pause :
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Donc au 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}