Je dois supprimer un dossier contenant d'autres dossiers et fichiers. J'ai essayé del
y rmdir
mais parfois elles échouent avec des lignes d'erreur : [PATH]: The directory isn't empty.
Existe-t-il une bonne alternative ?
Je dois supprimer un dossier contenant d'autres dossiers et fichiers. J'ai essayé del
y rmdir
mais parfois elles échouent avec des lignes d'erreur : [PATH]: The directory isn't empty.
Existe-t-il une bonne alternative ?
Cela m'arrive souvent avec mes scripts de construction automatisée.
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 la suppression du 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 handle.
Cela signifie que le fichier peut encore être présent lorsque le programme rmdir
tente de supprimer le dossier, d'où le message d'erreur. Peu de temps après, l'application en question fermera sa poignée, le fichier disparaîtra et, lorsque vous inspecterez le dossier pour voir quel est le fichier qui a été supprimé, le message d'erreur s'affichera. rmdir
parlait qu'il sera vide.
Du moins, c'est ma théorie.
La solution de contournement proposée par Harry Johnston semble bonne. Seulement, j'insérerais une pause entre les mots rmdir
les commandes. 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 la commande 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}
Vous avez peut-être des fichiers en lecture seule, vous pouvez utiliser l'option del /F pour vous en débarrasser en utilisant
del /S /F your_directory
rmdir your_directory
Vous pouvez également avoir des fichiers cachés et si vous êtes vraiment sûr de vouloir les supprimer, vous pouvez le faire à l'aide de la fonction
del /S /F /AH your_directory
rmdir your_directory
Si cela échoue toujours, soit vous n'avez pas la permission de supprimer certains fichiers, soit certains de ces fichiers sont encore utilisés.
Je crois qu'il y a un bogue dans Windows 7 (et peut-être d'autres versions) qui provoque parfois ce symptôme ; ou il pourrait s'agir d'un bogue dans un logiciel tiers. (Avez-vous Symantec Endpoint Protection installé par hasard ?)
Quoi qu'il en soit, j'ai rencontré ce problème assez souvent. Dans la plupart des cas, le problème peut être contourné en exécutant rd /s /q
deux ou trois fois de suite.
Si c'est dans un fichier batch, vous pouvez faire quelque chose comme ceci :
rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Utilice del
sur les fichiers à l'intérieur, puis rmdir
pour supprimer le dossier.
Pour utiliser le rmdir
pour supprimer également tous les fichiers, utilisez la méthode /S
commutateur avant le nom du répertoire, et /Q
pour supprimer l'invite à la suppression. C'est la meilleure façon de procéder, car aucun fichier ne vous échappe. Soyez prudent en utilisant le commutateur /Q cependant, car il ne vous avertira pas des attributs des fichiers système ou cachés.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.