Quelle est la façon la plus simple de supprimer de force un répertoire et tous ses sous-répertoires dans PowerShell? J'utilise PowerShell V2 dans Windows 7.
J'ai appris de plusieurs sources que la commande la plus évidente,, Remove-Item $targetDir -Recurse -Force
ne fonctionne pas correctement. Cela inclut une déclaration dans l'aide en ligne de PowerShell V2 (trouvée à l'aide Get-Help Remove-Item -Examples
) qui indique:
... Étant donné que le paramètre Recurse de cette applet de commande est défectueux, la commande utilise l'applet de commande Get-Childitem pour obtenir les fichiers souhaités et utilise l'opérateur de pipeline pour les transmettre à l'applet de commande Remove-Item ...
J'ai vu divers exemples qui utilisent Get-ChildItem et le redirigent vers Remove-Item , mais les exemples suppriment généralement certains ensembles de fichiers basés sur un filtre, pas le répertoire entier.
Je recherche le moyen le plus propre de supprimer un répertoire entier, des fichiers et des répertoires enfants, sans générer de messages d'avertissement utilisateur en utilisant le moins de code possible. Un one-liner serait bien s'il est facile à comprendre.
la source
RD /S /Q
rd
est un alias pourRemove-Item
dans PowerShell.cmd /c "rd /s /q"
fonctionne, cependant.Réponses:
fonctionne en effet comme annoncé ici.
sont des alias raccourcis qui fonctionnent aussi.
Pour autant que je l'ai compris, le
-Recurse
paramètre ne fonctionne tout simplement pas correctement lorsque vous essayez de supprimer un ensemble de fichiers filtrés de manière récursive. Pour tuer un seul répertoire et tout ce qui se trouve en dessous, cela semble bien fonctionner.la source
cmd /c rd
comme indiqué ci-dessous.J'ai utilisé:
Cela fonctionne pour moi comme un charme (je l'ai volé à Ubuntu).
la source
rm
est un alias pourRemove-Item
dans la configuration par défaut de PowerShell. Vérifiez la sortie deGet-Alias rm
pour plus de détails. Le-r
tire parti du comportement de correspondance partielle de PowerShell sur les paramètres. Étant donnéRemove-Item
que seul le paramètre qui commence par un «r»-Recurse
,-r
correspond à cela. Ainsi, ce qui suit tout fonctionnera de la même:rm -r
,rm -re
,Remove-Item -Recurse
. (Notez que nirm -rf
nirm -r -f
ne fonctionnera, mais fonctionnerarm -r -fo
.-rf
Ne correspond à aucun paramètre et-f
correspond à plus d'un.)rm -rf folder
et bien sûr, cela a échoué. Au départ, j'ai voté contre la réponse (car elle disait Ubuntu). Grâce au commentaire de @chwarr, je l'ai essayé sans lef
et il a repris l'alias plutôt que le binaire rm. J'aimerais que Tuan mette à jour sa source (je ne sais pas si Tuan savait que c'était un alias ou pensait vraiment que c'était la version unix ;-)-R
au lieu de-r
(bien que pour autant que je sache, PowerShell est comme le reste de Windows ne respecte pas la casse, donc cela ne devrait pas faire de différence), mais j'ai eu une erreur que les dossiers que j'essaie de supprimer sont pas vide.Lors de la suppression récursive de fichiers à l'aide d'un simple,
Remove-Item "folder" -Recurse
je vois parfois une erreur intermittente:[folder] cannot be removed because it is not empty.
Cette réponse tente d'éviter cette erreur en supprimant individuellement les fichiers.
Un détail important est le tri de tous les éléments avec
pspath -Descending
pour que les feuilles soient supprimées avant les racines. Le tri est effectué sur lepspath
paramètre car cela a plus de chances de fonctionner pour des fournisseurs autres que le système de fichiers. le-Include
paramètre n'est qu'une commodité si vous souhaitez filtrer les éléments à supprimer.Il est divisé en deux fonctions car je trouve utile de voir ce que je vais supprimer en exécutant
la source
remove-item -recurse
dans Powershell v5, donc cette solution est la meilleure pour moi.... a travaillé pour moi
la source
Essayez cet exemple. Si le répertoire n'existe pas, aucune erreur n'est générée. Vous devrez peut-être PowerShell v3.0.
la source
Utilisez la commande DOS old-school:
la source
/q
(mode silencieux, ne demandez pas si vous pouvez supprimer une arborescence de répertoires avec / S).Pour une raison quelconque, la réponse de John Rees n'a parfois pas fonctionné dans mon cas. Mais cela m'a conduit dans la direction suivante. J'essaie d'abord de supprimer le répertoire récursivement avec l'option buggy -recurse. Ensuite, je descends dans chaque sous-répertoire restant et je supprime tous les fichiers.
la source
Pour éviter les erreurs "Le répertoire n'est pas vide" de la réponse acceptée, utilisez simplement la bonne vieille commande DOS comme suggéré précédemment. La syntaxe PS complète prête pour le copier-coller est:
la source
J'ai pris une autre approche inspirée de @ john-rees ci-dessus - en particulier lorsque son approche a commencé à échouer pour moi à un moment donné. Récapitulez les sous-arbres et triez les fichiers en fonction de leur longueur de chemin - supprimez du plus long au plus court
En ce qui concerne la magie -LiteralPath, voici un autre gotchya qui pourrait vous frapper: https://superuser.com/q/212808
la source
OU
Si vous avez un énorme répertoire, ce que je fais habituellement est
Exécutez-le sur un autre terminal PowerShell et il s'arrêtera une fois terminé.
la source
La suppression d'une arborescence de dossiers entière fonctionne parfois et échoue parfois avec des erreurs «Répertoire non vide». Par la suite, essayer de vérifier si le dossier existe toujours peut entraîner des erreurs «Accès refusé» ou «Accès non autorisé». Je ne sais pas pourquoi cela se produit, bien que certaines informations puissent être tirées de cette publication StackOverflow .
J'ai pu contourner ces problèmes en spécifiant l'ordre dans lequel les éléments du dossier sont supprimés et en ajoutant des retards. Ce qui suit fonctionne bien pour moi:
Un article Microsoft TechNet utilisant les propriétés calculées dans PowerShell m'a été utile pour obtenir une liste de sous-dossiers triés par profondeur.
Des problèmes de fiabilité similaires avec RD / S / Q peuvent être résolus en exécutant DEL / F / S / Q avant RD / S / Q et en exécutant le RD une deuxième fois si nécessaire - idéalement avec une pause entre les deux (c'est-à-dire en utilisant ping comme indiqué au dessous de).
la source
Vraiment simple:
la source
Une autre astuce utile:
Si vous trouvez beaucoup de fichiers avec une convention de nom identique ou similaire (comme un fichier mac avec un nom de préfixe de point ... ce fameux pulltion de fichier), vous pouvez facilement les supprimer avec une seule ligne du PowerShell comme ceci:
Cette ligne va supprimer tous les fichiers avec un point au début du nom dans le répertoire courant, ainsi que tous les fichiers ayant les mêmes circonstances dans d'autres dossiers de ce répertoire. Soyez conscient lors de son utilisation. :RÉ
la source
rm -rf .*
? Je n'ai pas de PowerShell à tester, mais je pense que cela fonctionnera.Pour supprimer le contenu complet, y compris la structure des dossiers, utilisez
L'
-recurse
ajout àremove-item
garantit que les invites interactives sont désactivées.la source
A écrit ce qui précède pour nettoyer certains fichiers journaux sans supprimer le répertoire parent et cela fonctionne parfaitement!
la source
la source