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

14voto

steve Points 127

Essayez cet exemple. Si le répertoire n'existe pas, aucune erreur n'est signalée. Vous aurez peut-être besoin de PowerShell v3.0.

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue

10voto

Utilisez la bonne vieille commande DOS :

rd /s <dir>

2 votes

Si cela fait partie d'un script, vous devriez utiliser /q (Mode silencieux, ne demande pas si l'on peut supprimer une arborescence de répertoires avec /S) aussi.

10voto

Dejan Points 440

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 à être copiée-collée est la suivante :

& cmd.exe /c rd /S /Q $folderToDelete

4 votes

Il donne toujours l'erreur "Le répertoire n'est pas vide" pour les dossiers !?

9voto

jdoose Points 353

Pour une raison quelconque, la réponse de John Rees n'a pas toujours fonctionné dans mon cas. Mais elle m'a conduit dans la direction suivante. D'abord, j'essaie de supprimer le répertoire de manière récursive avec l'option -recurse, qui est boguée. Ensuite, je descends dans chaque sous-répertoire restant et je supprime tous les fichiers.

function Remove-Tree($Path)
{ 
    Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue

    if (Test-Path "$Path\" -ErrorAction silentlycontinue)
    {
        $folders = Get-ChildItem -Path $Path –Directory -Force
        ForEach ($folder in $folders)
        {
            Remove-Tree $folder.FullName
        }

        $files = Get-ChildItem -Path $Path -File -Force

        ForEach ($file in $files)
        {
            Remove-Item $file.FullName -force
        }

        if (Test-Path "$Path\" -ErrorAction silentlycontinue)
        {
            Remove-Item $Path -force
        }
    }
}

0 votes

Pouvez-vous reproduire l'erreur lors de l'exécution de mes fonctions ? J'aimerais le savoir afin de pouvoir les améliorer.

0 votes

Désolé, je ne me souviens pas de la configuration exacte :/ Je pense que c'était lorsque plusieurs sous-répertoires étaient impliqués. Il est arrivé que l'appel à "Remove-Item -force -recurse" ne supprime pas tous les fichiers et dans ce cas, le dernier Remove-Tree a échoué parce que le répertoire n'était pas vide. C'est pourquoi j'ai trouvé une nouvelle solution pour essayer d'abord la version intégrée boguée (-force) et ensuite descendre manuellement dans chaque répertoire et supprimer "manuellement" ce qui reste. Cette version est utilisée régulièrement et jusqu'à présent, elle fonctionne. La seule raison pour laquelle elle a échoué est qu'un programme détient encore un handle sur un répertoire.

5voto

Gajendra D Ambi Points 1106
del <dir> -Recurse -Force # I prefer this, short & sweet

OU

remove-item <dir> -Recurse -Force

Si vous avez un énorme répertoire, ce que je fais habituellement est de

while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}

Exécutez ceci sur un autre terminal powershell et il s'arrêtera quand il aura terminé.

0 votes

J'admets que votre idée avec le suivi peut être utile, mais elle est à peine différente de la simple impression d'un message une fois qu'il est terminé, et au cas où il y aurait un problème pour arrêter le Remove-Item, votre boucle ne se terminera jamais.

0 votes

@RaúlSalinas-Monteagudo C'est vrai, mais c'est définitivement pour un scénario de production ou d'utilisation sans surveillance. Il doit être suffisamment petit pour que quelqu'un puisse s'en souvenir et le taper sur le champ, et non pour exécuter un fichier .ps1 sophistiqué vers un simple répertoire.

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