480 votes

Comment supprimer récursivement un répertoire entier avec PowerShell 2.0 ?

Quel est le moyen le plus simple de supprimer de force un répertoire et tous ses sous-répertoires dans PowerShell ? J'utilise PowerShell V2 sous 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 en utilisant Get-Help Remove-Item -Examples ) qui stipule :

...Comme le paramètre Recurse de cette cmdlet est défectueux, la commande utilise la cmdlet Get-Childitem pour obtenir les fichiers souhaités, et elle utilise l'opérateur pipeline pour les transmettre à la cmdlet Remove-Item...

J'ai vu plusieurs exemples qui utilisent Get-ChildItem et l'envoyer à Remove-Item mais les exemples suppriment généralement un ensemble de fichiers en fonction d'un filtre, et non le répertoire entier.

Je cherche le moyen le plus propre de faire sauter un répertoire entier, des fichiers et des répertoires enfants, sans générer de messages d'avertissement pour l'utilisateur et en utilisant le moins de code possible. Une solution en une seule ligne serait la bienvenue si elle est facile à comprendre.

2 votes

Powershell, je sais, mais RD /S /Q

0 votes

0 votes

Je ne pense pas que ce soit un doublon. J'ai examiné la question 1667145 avant de la poster. Il s'agit de savoir pourquoi PowerShell ne définit pas correctement le paramètre bool Recurse lors de l'appel de l'implémentation de la méthode Remove-Item d'un fournisseur PowerShell personnalisé. Je demandais le comportement de Remove-Item en relation avec le fournisseur de système de fichiers intégré.

818voto

Joey Points 148544
Remove-Item -Recurse -Force some_dir

fonctionne effectivement comme annoncé ici.

rm -r -fo some_dir

sont des alias raccourcis qui fonctionnent également.

D'après ce que j'ai compris, le -Recurse ne fonctionne pas correctement lorsque vous essayez de supprimer un ensemble filtré de fichiers de manière récursive. Pour supprimer un seul répertoire et tout ce qui se trouve en dessous, cela semble fonctionner correctement.

8 votes

Je pense que vous avez raison. J'obtenais une erreur "Impossible de supprimer l'élément à 'certain répertoire' parce qu'il est en cours d'utilisation" et j'ai supposé que c'était un problème avec l'algorithme de récursion et j'ai cherché une solution de contournement. Il s'avère que j'avais un processus que j'avais déclenché plus tôt dans le script qui travaillait dans le répertoire cible. Lorsque j'ai modifié le script pour attendre l'autre processus, la commande "Remove-Item -Recurse -Force" fonctionne. Toujours regarder dans le miroir d'abord :)

26 votes

J'ai constaté que je dois l'exécuter deux fois lorsqu'elle est exécutée sur un répertoire qui contient des sous-répertoires. La première fois, il y aura beaucoup d'erreurs "Le répertoire n'est pas vide". La deuxième fois, l'opération se termine sans aucune erreur.

5 votes

Kristopher Johnson, j'obtiens des erreurs similaires avec différents outils sous Windows 7. Il semble que l'appel de suppression revienne avant qu'un fichier ou un dossier ne soit réellement supprimé, ce qui cause parfois des problèmes. Cela semble se produire dans Explorer, Far, cmd et PowerShell.

46voto

Tuan Jinn Points 81

J'ai utilisé :

rm -r folderToDelete

Cela fonctionne pour moi comme un charme (je l'ai volé à Ubuntu).

0 votes

Cela ne nécessite-t-il pas cygwin, git, ou un autre outil qui peut simuler un shell bash sous Windows ?

22 votes

@Pete, non, cela ne nécessite rien d'autre que PowerShell. rm est un alias pour Remove-Item dans la configuration par défaut de PowerShell. Vérifiez la sortie de Get-Alias rm pour plus de détails. Le site -r tire parti du comportement de correspondance partielle de PowerShell sur les paramètres. Puisque Remove-Item n'a que le seul paramètre qui commence par un 'r', -Recurse , -r correspond à cela. Ainsi, les éléments suivants fonctionneront tous de la même manière : rm -r , rm -re , Remove-Item -Recurse . (Notez que ni rm -rf ni rm -r -f fonctionnera, mais rm -r -fo volonté. -rf ne correspond à aucun paramètre et -f correspond à plusieurs d'entre eux).

1 votes

Qu'est-ce que c'est que ça ? L'alias Powershell rm pour "Remove-Item -Recurse -Force some_dir" fonctionne mieux que l'utilisation directe de remove-item. Je reçois les mêmes erreurs "Cannot remove the item at 'some directory'". Je passe de remove-item à rm -r sans aucune erreur !?

34voto

John Rees Points 91

Lorsque l'on supprime des fichiers de manière récursive en utilisant une 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.

function Get-Tree($Path,$Include='*') { 
    @(Get-Item $Path -Include $Include -Force) + 
        (Get-ChildItem $Path -Recurse -Include $Include -Force) | 
        sort pspath -Descending -unique
} 

function Remove-Tree($Path,$Include='*') { 
    Get-Tree $Path $Include | Remove-Item -force -recurse
} 

Remove-Tree some_dir

Un détail important est le tri de tous les éléments avec pspath -Descending de sorte que les feuilles soient supprimées avant les racines. Le tri se fait sur le pspath puisque ce paramètre a plus de chance de fonctionner pour les fournisseurs autres que le système de fichiers. L'adresse -Include est juste une commodité si vous voulez filtrer les éléments à supprimer.

Il est divisé en deux fonctions car je trouve utile de voir ce que je suis sur le point de supprimer en exécutant

Get-Tree some_dir | select fullname

3 votes

En résolvant un problème en utilisant PowerShell dans les scripts de construction TFS, cela s'est avéré être la bonne réponse.

1 votes

C'est la solution pour moi aussi. Prenez des points, mon bon monsieur !

0 votes

Ça a marché pour moi. Je n'ai pas réussi à obtenir la suppression récursive du contenu d'un dossier, mais votre solution a fonctionné pour moi. Merci.

17voto

Jedininjaster Points 139
rm -r ./folder -Force    

...a fonctionné pour moi

15voto

mikey Points 89

Si vous utilisez powershell, vous pouvez l'utiliser, comme expliqué dans la réponse acceptée :

rm -r -fo targetDir

Mais j'ai trouvé plus rapide d'utiliser l'invite de commande de Windows.

rmdir /s/q targetDir

En plus d'être plus rapide, l'option de l'invite de commande présente l'avantage de commencer à supprimer les fichiers immédiatement (powershell effectue d'abord une énumération). Ainsi, si quelque chose se brise pendant l'exécution, vous avez au moins progressé dans la suppression des fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X