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>\"

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.)


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

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.


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


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


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>"

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

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


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

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%

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
)

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.