Supprimer complètement un dossier dans Windows à l'aide de la ligne de commande

57

Je dois supprimer un dossier contenant d'autres dossiers et fichiers à l'intérieur. J'ai essayé delet des rmdircommandes mais parfois elles échouent avec quelques lignes d'erreur:[PATH]: The directory isn't empty.

Y a-t-il une bonne alternative?

Francesco Zanini
la source
J'ai constaté une incohérence dans le fait de savoir si rmdir avec les indicateurs appropriés supprime tout ce qui se trouve dans une arborescence de répertoires (et / ou dans l'arborescence elle-même), et la seule explication possible que j'ai est ce que dit Harry Johnston.
r_alex_hall

Réponses:

15

Cela m’arrive beaucoup 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 une suppression du fichier (c'est pourquoi je suppose que l'appel DeleteFile n'échoue pas), mais le fichier ne disparaîtra qu'après que ladite application aura fermé son handle.

Cela signifie que le fichier peut toujours être présent lorsque la rmdircommande tente de supprimer le dossier, d'où le message d'erreur. Peu de temps après, ladite application fermera son handle, le fichier disparaîtra et lorsque vous inspecterez le dossier pour voir quel fichier en rmdirparlait, il sera vide.

Au moins c'est ma théorie.

La solution de contournement proposée par Harry Johnston semble bonne. Seulement je voudrais insérer une pause entre les rmdircommandes. Bien entendu, Windows ne dispose pas de commande "pause" facilement scriptable (correction: les anciennes versions de Windows ne le sont pas, les plus récentes ont - voir les commentaires). Mais si la granularité en secondes est suffisante, on peut utiliser pingpour 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}
Paul Groke
la source
D'après mon expérience, une pause n'est jamais nécessaire, mais YMMV. (Bien sûr, s'il y a vraiment une autre application en jeu, il est préférable de l'identifier et d'attendre explicitement sa sortie si possible.)
Harry Johnston
Eh bien ... j’ai mis en place une nouvelle tentative 10x avec un délai d’une seconde par tentative. Fonctionne maintenant. Je ne vais pas essayer de supprimer la pause, seulement pour le voir échouer à nouveau :-) Bien sûr, cela ne veut pas dire que c'est nécessaire. Juste être très prudent.
Paul Groke
2
OT: C'est pourquoi je déteste les fenêtres. Tout est si difficile. rm -rf /directory/devrait être global sur tous les systèmes d'exploitation.
2
Il y a en fait une commande de "pause"; pour faire une pause de trois secondes, vous pouvez utiliser ceci:timeout /t 3
r_alex_hall
@r_alex_hall En effet (mais en mode natif uniquement à partir de Vista, XP et les versions antérieures n'ont pas la pausecommande).
Misha256
57

Essayer:

rmdir /S your_directory

ou:

rmdir /S /Q your_directory 

ignorer les messages de confirmation.

AndrewQ
la source
1
J'ai déjà essayé ces options, mais comme je l'ai écrit delet rmdirne demande rien, ils envoient simplement des lignes comme celle de la description.
Francesco Zanini
2
rmdir /ssupprimera tout ce qu'il est possible de supprimer. Vous pouvez avoir des fichiers verrouillés par un programme, des fichiers en lecture seule ou des fichiers dont vous avez besoin d'un accès administratif à supprimer. Il n'y a pas une seule commande qui s'occupe de toutes ces situations pour vous
nvuono
Si vous recevez toujours des messages d'erreur, essayez avec PowerShell: la cmdlet Remove-Item est un peu plus puissante que rmdir.
AndrewQ
1
rmdir / S <répertoire> Supprime le répertoire, les sous-répertoires et les répertoires. Il demande également Etes-vous sûr. Sur Windows 10. Merci
Jasmeet
1
@r_alex_hall RMDIR / s supprime effectivement les fichiers dans les répertoires. Mais DEL / s ne supprimera que les fichiers et conservera les répertoires. C’est pourquoi RMDIR est la meilleure option
JCH2k
11

Vous pouvez avoir 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 en utilisant

     del /S /F /AH your_directory
     rmdir your_directory

Si le problème persiste, vous n'êtes pas autorisé à supprimer certains fichiers ou certains fichiers sont toujours en cours d'utilisation.

sgmoore
la source
Cela devrait être la bonne réponse!
Jdhao
4

Je pense qu'il y a un bogue dans Windows 7 (et peut-être dans d'autres versions) qui provoque parfois ce symptôme; ou cela pourrait être un bogue dans un logiciel tiers. (Symantec Endpoint Protection est-il installé par hasard?)

Quoi qu'il en soit, je l'ai rencontré assez souvent. Dans la plupart des cas, le problème peut être résolu en s'exécutant rd /s /qdeux ou trois fois de suite.

Si cela se trouve dans un fichier de commandes, 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
Harry Johnston
la source
D'accord. L'utilisation de rd / s foo - sans l'option / q silencieuse - supprimera tous les sous-dossiers pour vous, mais vous devez répondre à l'invite par l'invite, de sorte que les fichiers de traitement par lots doivent être traités. Moins qu'idéal je sais.
Anthony
3

Utilisez delsur les fichiers à l'intérieur, puis rmdirpour supprimer le dossier.

Pour que la rmdirméthode supprime également tous les fichiers, utilisez le /Scommutateur situé avant le nom du répertoire et /Qsupprimez l'invite de suppression. C’est la meilleure façon de le faire, car vous ne manquez aucun fichier. Soyez prudent en utilisant le commutateur / Q, car il ne vous avertira pas des attributs de fichier système ou cachés.

Canadien Luke REINSTATE MONICA
la source
2

Si vous utilisez node, vous pouvez utiliser la dépendance rimraf comme ceci:

lancer l'installation: npm install rimraf -g

supprimer le dossier: rimraf SourceFolder

Cela m'a aidé à obtenir l'erreur:

les noms de fichier source sont plus grands que ceux pris en charge par le système de fichiers

Dustin Spengler
la source
0

Dossier anciennes versions de Windows (DOS, Windows 95/98 / ME), DELTREEest équivalent à RMou RMDIR. J'utilise bien DELTREEsur mon poste de travail Windows 7 en fichiers de commandes.

Deletes a directory and all the subdirectories and files in it.

To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y              Suppresses prompting to confirm you want to delete
                  the subdirectory.
  [drive:]path    Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Soleil
la source
0

Je pense que vous pouvez l'utiliser comme ceci:

msg*your file is going to delete 
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\" 
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"
Shubham Dwivedi
la source
1
Bienvenue chez SU! Pourquoi j'ai voté? 1) Mauvaise mise en forme 2) Fournit la même solution essentielle que celle déjà affichée depuis plusieurs années (lisez toujours les solutions postées avant d’en publier une nouvelle!) 3) N’est pas adapté à la question (votre solution recrée le dossier supprimé, qui n'a pas été demandé).
zagrimsan