Comment résoudre l'erreur «Le répertoire n'est pas vide» lors de l'exécution de la commande rmdir dans un script batch?

92

Je crée un script batch et une partie du script essaie de supprimer un répertoire et tous ses sous-répertoires. J'obtiens une erreur intermittente indiquant qu'un sous-répertoire n'est pas vide. J'ai lu un article sur l'indexation en tant que coupable. J'ai désactivé WSearch mais j'ai finalement eu à nouveau l'erreur. Voici la commande:

rmdir /S /Q "C:\<dir>\"
Grabuge
la source
Puis-je demander des informations sur le type de fichiers dont Windows vous alerte? Pour moi, cela ne se produit qu'avec les fichiers PDF peu de temps après que je les ai déplacés / copiés.
Jake Stevens-Haas

Réponses:

88

J'ai connu les mêmes problèmes que ceux mentionnés par Harry Johnston. rmdir /s /qse plaindrait qu'un répertoire n'était pas vide même s'il /sest destiné à faire le vidage pour vous! Je pense que c'est un bogue dans Windows, personnellement.

Ma solution de contournement consiste à deltout ce qui se trouve dans le répertoire avant de supprimer le répertoire lui-même:

del /f /s /q mydir 1>nul
rmdir /s /q mydir

(Le 1>nulmasque la sortie standard de delcar sinon, il répertorie tous les fichiers qu'il supprime.)

BoffinBrain
la source
Je suis tombé sur un scénario dans lequel certains sous-répertoires mydirproduisaient la même erreur "pas vide". J'ai donc dû cdentrer mydiret exécuter les delfichiers dans chacun de ces répertoires également. En fin de compte, cela a fonctionné, mais si j'avais dû répéter le processus une troisième fois à un autre sous-niveau, je me serais senti assez vaincu.
gfullam
@gfullam Autant que je me souvienne, ma méthode devrait également fonctionner sur des sous-répertoires récursifs, quelle que soit la profondeur. Voilà ce que del /sfait.
BoffinBrain
En utilisant l'explorateur (probablement aussi mkdir => NO!), L'ajout d'un dossier (et la modification du nom) termine le travail de suppression en utilisant uniquement la rd /s /q mydircommande.
Master DJon
1
D'accord, je pense que supprimer les fenêtres et passer à Linux est beaucoup plus facile que cette douleur :)
RajnishCoder
1
@RajnishCoder Vivre avec Windows est essentiellement un monde de solutions de contournement. Ce problème particulier n'est rien comparé à d'autres problèmes avec Windows 10!
BoffinBrain
47

Je connais ce problème. La solution de contournement la plus simple consiste à répéter l'opération sous condition. Je ne l'ai jamais vu échouer deux fois de suite - à moins qu'il n'y ait réellement un fichier ouvert ou un problème d'autorisations, évidemment!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme
Harry Johnston
la source
11
Holy Molly, cela n'a aucun sens mais cela a fonctionné. Qu'est-ce que #!% # @! microsoft
Sam B
IF EXISTse cache Access is deniedet autres situations. J'ai ajouté DIR c:\deletemequelque chose comme et la vérification des erreurs avant tout.
it3xl
L'ouverture de l'explorateur Windows dans un sous-répertoire ou la navigation d'une autre manière entraîne l'échec deux fois de suite. Alors assurez-vous de le poser une troisième fois (ce qui a réellement fonctionné)
Jake Stevens-Haas
En fait, cela s'est produit deux fois de suite pour moi sans rien ouvert ni problème d'autorisations. Mon record est de sept fois. Recommander l'approche de @ BoffinbraiN.
Jake Stevens-Haas
Je n'ai exécuté que la première commande. Ensuite, faites un clic droit sur le dossier> Propriétés> Décochez l'attribut «Lecture seule»> Appliquer. Viola !, le dossier a finalement disparu.
steven7mwesigwa
21

Je viens de rencontrer le même problème et cela avait à voir avec la perte ou la corruption de certains fichiers. Pour corriger le problème, exécutez simplement check disk:

chkdsk /F e:

Cela peut être exécuté à partir de la fenêtre de recherche ou à partir d'une invite cmd. Le /Fcorrige tous les problèmes qu'il trouve, comme la récupération des fichiers. Une fois que cela se termine, vous pouvez supprimer les fichiers et les dossiers comme d'habitude.

jrose
la source
Parfait, j'essayais depuis une demi-heure
trex
Cela a trouvé des fichiers cachés dans mon dossier, que j'ai ensuite pu supprimer. Vraiment méchant 😑
Battre
21

entrez l'invite de commande en tant qu'administrateur et exécutez

rmdir /s <FOLDER>
Adilson Cabral
la source
2
Ce n'est pas différent de ce que faisait le PO.
Harry Johnston
7

J'ai eu un problème similaire, j'ai essayé de supprimer un dossier vide via l'explorateur Windows. M'a montré l'erreur non vide, alors j'ai pensé l'essayer via admin cmd, mais aucune des réponses ici n'a aidé.

Après avoir déplacé un fichier dans le dossier vide. J'ai pu supprimer le dossier non vide

Grisu118
la source
1
Veuillez l'écrire en commentaire.
Virb
Intéressant. Probablement pas pertinent pour le scénario des PO, cependant.
Harry Johnston
Holy moly, c'était littéralement la seule pensée qui a fonctionné de toutes ces autres solutions!
Seega
3

Comme @gfullam l'a déclaré dans un commentaire à la réponse de @ BoffinbraiN, le que <dir>vous supprimez lui-même peut ne pas être celui qui contient des fichiers: il peut y avoir des sous-répertoires <dir>qui reçoivent un message "Le répertoire n'est pas vide" et la seule solution serait alors de itérer récursivement sur les répertoires, en supprimant manuellement tous leurs fichiers contenant ... J'ai fini par décider d'utiliser un port d' rmUNIX. rm.exeest livré avec Git Bash, MinGW, Cygwin, GnuWin32 et autres. Il vous suffit d'avoir son répertoire parent dans votre PATH puis de l'exécuter comme vous le feriez dans un système UNIX.

Exemple de script batch:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"
Gobe
la source
2

Ce qui a fonctionné pour moi est le suivant. Il semble que la commande RMDir émettra "Le répertoire n'est pas vide" presque tout le temps ...

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders
utilisateur7432246
la source
2

J'avais "C: \ Users \ User Name \ OneDrive \ Fonts", qui était mklink'ed (/ D) à "C: \ Windows \ Fonts", et j'ai eu le même problème. Dans mon cas

cd "C: \ Utilisateurs \ Nom d'utilisateur \ OneDrive"

Polices rd / s

O (pour confirmer l'action)

m'a aidé. J'espère que cela vous aide aussi; D

Maciej Bledkowski
la source
2
Ajoutez / q pour éviter d'avoir besoin de confirmation lors de l'exécution d'un lot.
Jonathan Rosenne
1

Im mon cas, je viens de déplacer le dossier vers le répertoire racine comme ça.

move <source directory> c:\

Et puis a exécuté la commande pour supprimer le répertoire

rmdir c:\<moved directory> /s /q
Daniel Barde
la source
2
rmdir c:\<moved directory> /s /qest la bonne réponse
lalengua
1
Ce n'est PAS la bonne réponse. la suppression d'un dossier à la racine peut provoquer les mêmes messages: le dossier n'est pas vide.
Gangnus
Je sais que c'est un vieux fil. Je voulais juste dire que cela a fonctionné pour moi ...
Manuel Rivera
1

La raison du rd /srefus de supprimer certains fichiers est probablement due aux attributs de fichier READONLY sur les fichiers du répertoire.

La bonne façon de résoudre ce problème est de vous assurer que vous réinitialisez d'abord les attributs sur tous les fichiers:

attrib -r %directory% /s /d
rd /s %directory%

Il peut y en avoir d'autres tels que des fichiers cachés ou système, donc si vous voulez jouer en toute sécurité:

attrib -h -r -s %directory% /s /d
rd /s %directory%
Peter Hoeg
la source
0

Semblable à la réponse de Harry Johnston, je boucle jusqu'à ce que cela fonctionne.

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)
BuvinJ
la source
0

Windows est parfois "cassé par conception", vous devez donc créer un dossier vide, puis mettre en miroir le "dossier cassé" avec un "dossier vide" en mode sauvegarde.

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

Créez un répertoire vide comme ceci:

mkdir empty

écraser le dossier cassé avec vide comme ceci:

robocopy /copyall /mir /b empty broken

puis supprimez ce dossier

rd broken /s
rd empty /s

Si cela ne résout pas le problème, essayez de redémarrer en "mode de récupération avec invite de commande" en maintenant la touche Maj enfoncée lorsque vous cliquez sur redémarrer et en essayant d'exécuter à nouveau ces commandes en mode de récupération

Kristijonas Grigorovičius
la source
Oui, je pense que Robocopy fonctionnerait dans le scénario OP, car il réessaye automatiquement les opérations qui ont échoué. Vous voudrez probablement spécifier /W:0pour éviter des retards inutiles. Vous ne voudrez peut-être pas, /bcar cela nécessite des privilèges administratifs. Le mode de récupération n'est pas pertinent pour cette question, car nous parlons d'un script batch, pas de quelqu'un essayant manuellement de supprimer un répertoire.
Harry Johnston le
-1

Je peux penser aux causes possibles suivantes:

  1. il y a des fichiers ou des sous-répertoires qui nécessitent des autorisations plus élevées
  2. il y a des fichiers en cours d'utilisation, non seulement par WSearch, mais peut-être par votre antivirus ou autre chose

Pour 1.), vous pouvez essayer runas /user:Administratorafin d'obtenir des privilèges plus élevés ou démarrer le fichier batch en tant qu'administrateur via le menu contextuel. Si cela n'aide pas, peut-être que même l'administrateur n'a pas les droits. Ensuite, vous devez reprendre la propriété de l'annuaire.

Pour 2.) téléchargez Process Explorer , cliquez Find/Find handle or DLL...ou appuyez sur Ctrl+F, tapez le nom du répertoire et découvrez qui l'utilise. Fermez l'application qui utilise le répertoire, si possible.

Thomas Weller
la source
Les machines ont le compte administrateur désactivé. Je suis dans le groupe admin mais je ne connais pas de mot de passe administrateur. Avez-vous d'autres suggestions pour contourner le problème d'autorisation? Quelqu'un a mentionné appeler un autre programme à partir de batch (comme vba).
Mayhem
@Mayhem: contourner les autorisations est assez difficile ... Nous aurions probablement besoin d'un exploit pour un bug dans Windows pour faire cela sans mot de passe.
Thomas Weller