J'ai besoin d'un moyen de supprimer récursivement un dossier et ses enfants.
Existe-t-il un outil prédéfini pour cela, ou dois-je en écrire un?
DEL /S
ne supprime pas les répertoires.
DELTREE
a été supprimé de Windows 2000+
RMDIR ou RD si vous utilisez l'invite de commande classique (cmd.exe):
rd /s /q "path"
Si vous utilisez PowerShell, vous pouvez utiliser Remove-Item
(alias del
, erase
, rd
, ri
, rm
et rmdir
) et prend un argument -Recurse
qui peut être raccourci en -r
rd -r "path"
admin:
takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder
Fonctionne pour tout, y compris les fichiers système
EDIT: J'ai en fait trouvé le meilleur moyen de résoudre le problème du chemin d'accès aux fichiers trop long:
mkdir \empty
robocopy /mir \empty folder
_RMDIR [/S] [/Q] [drive:]path
_
_RD [/S] [/Q] [drive:]path
_
/S
Supprime tous les répertoires et fichiers du répertoire spécifié en plus du répertoire lui-même. Utilisé pour supprimer une arborescence de répertoires.
_/Q
_ Mode silencieux, ne demandez pas si vous pouvez supprimer une arborescence de répertoires avec _/S
_
Accédez au chemin et déclenchez cette commande.
rd /s /q "FOLDER_NAME"
/ s: supprime le répertoire spécifié et tous les sous-répertoires, y compris les fichiers. Utilisez/s pour supprimer un arbre.
/ q: exécute rmdir en mode silencieux. Supprime les répertoires sans confirmation.
/? : Affiche l'aide à l'invite de commande.
Vous pouvez installer cygwin, qui a rm
ainsi que ls
etc.
Pour supprimer un répertoire (qu'il existe ou non), utilisez ce qui suit:
if exist myfolder ( rmdir /s/q myfolder )
rmdir /S /Q %DIRNAME%
rmdir/s dirname
Essayez cette commande:
del /s foldername
Voyons d’abord ce que rm -rf
fait:
C:\Users\ohnob\things>touch stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>mkdir stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>ls -l
total 0
C:\Users\ohnob\things>rm -rf stuff.txt
Il existe trois scénarios dans lesquels rm -rf
est couramment utilisé pour renvoyer 0
:
Je vais ignorer l’ensemble des autorisations, mais personne n’utilise les autorisations ni ne tente de se refuser l’accès en écriture sur des éléments de Windows (OK, c’est une blague…).
Commencez par définissez ERRORLEVEL
sur , puis supprimez le chemin uniquement s’il existe, en utilisant des commandes différentes selon qu’il s’agisse ou non d’un répertoire. IF EXIST
ne définit pas ERRORLEVEL
à 0 si le chemin n'existe pas. Par conséquent, il est nécessaire de définir d'abord ERRORLEVEL
sur 0 pour détecter correctement le succès d'une manière qui imite la méthode normale rm -rf
usage. Garder la RD
avec IF EXIST
est nécessaire car RD
, contrairement à rm -f
, générera une erreur si la cible n'existe pas.
L'extrait de script suivant suppose que DELPATH est pré-coté. (Ceci est sûr lorsque vous faites quelque chose comme SET DELPATH=%1
. Essayez de mettre ECHO %1
dans un .cmd
et en lui passant un argument avec des espaces pour voir ce qu'il se passe vous-même). Une fois que l'extrait est terminé, vous pouvez vérifier l'échec avec IF ERRORLEVEL 1
.
: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%
Le fait est que tout est plus simple lorsque l'environnement est simplement conforme à POSIX. Ou si vous installez un minimum MSYS et utilisez-le.
Voici ce que tu dois faire...
Créer un fichier batch avec la ligne suivante
RMDIR /S %1
Enregistrez votre fichier batch sous Remove.bat
et mettez-le dans C:\windows
Créez la clé de registre suivante
HKEY_CLASSES_ROOT\Directory\Shell\Remove Directory (RMDIR)
Lancez regedit
et mettez à jour la valeur par défaut HKEY_CLASSES_ROOT\Directory\Shell\Remove Directory (RMDIR)\default
avec la valeur suivante
"c:\windows\REMOVE.bat" "%1"
C'est ça! Maintenant, vous pouvez cliquer avec le bouton droit sur n’importe quel répertoire et utiliser la fonction RMDIR.
Vous pouvez installer GnuWin32 et utiliser les commandes * nix en mode natif sur Windows. Je l’installe avant d’installer quoi que ce soit d’autre sur une copie fraîche de Windows à la menthe. :)
La réponse acceptée est excellente, mais en supposant que vous avez Node installé, vous pouvez le faire beaucoup plus précisément avec la bibliothèque de noeuds "rimraf", qui permet de placer des modèles. Si vous l'utilisez beaucoup (je le fais), installez-le simplement dans le monde entier.
yarn global add rimraf
puis, par exemple, un motif que j'utilise constamment:
rimraf .\**\node_modules
ou pour un one-liner qui vous permet d'esquiver l'installation globale, mais qui prend un peu plus de temps pour le téléchargement dynamique du package:
npx rimraf .\**\node_modules
UTILISEZ AT VOTRE PROPRE RISQUE. INFORMATIONS FOURNIES "EN L'ÉTAT". NON TESTÉ PAR EXTENSION.
Cliquez avec le bouton droit de la souris sur l'icône Windows (généralement en bas à gauche)> cliquez sur "Windows PowerShell (Admin)"> utilisez cette commande (avec la diligence requise, vous pouvez facilement supprimer tous vos fichiers si vous ne faites pas attention):
rd -r -include *.* -force somedir
Où somedir
est le répertoire non vide que vous souhaitez supprimer.
Notez qu'avec des disques externes attachés ou des disques présentant des problèmes, Windows se comporte parfois de façon étrange - la suppression (ou toute tentative de copie) ne se produit pas d'erreur, mais le répertoire n'est pas supprimé (ou copié) comme indiqué. (J'ai constaté que, dans ce cas, du moins pour moi, la commande donnée par @n_y dans sa réponse produirait des erreurs telles que "get-childitem: le fichier ou le répertoire est corrompu et illisible." Dans PowerShell).
Utiliser Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Remplacez les journaux par le nom du répertoire que vous souhaitez supprimer.
get-childitem recherche le répertoire enfants avec le nom récursivement depuis le chemin actuel (.).
remove-item supprime le résultat.
via Powershell
Remove-Item -Recurse -Force "TestDirectory"
via l'invite de commande
voici ce qui a fonctionné pour moi:
Essayez simplement de diminuer la longueur du chemin. i.e :: Renommez tous les dossiers qui mènent à un tel fichier en noms les plus petits possibles. Dites les noms d'une lettre. Renommez vers le haut dans la hiérarchie des dossiers. De cette façon, vous réduisez efficacement la longueur du chemin. Enfin, essayez de supprimer le fichier immédiatement.