Comment supprimer de façon récursive un répertoire entier avec PowerShell 2.0?

Quelle est la façon la plus simple de supprimer 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 en utilisant Get-Help Remove-Item -Examples ) qui stipule:

...Parce que le paramètre de Récurse dans ce cmdlet est défectueux, le la commande utilise le cmdlet Get-Childitem pour obtenir les fichiers désirés, et il utilise l'opérateur de pipeline pour les passer au cmdlet Remove-Item...

j'ai vu divers exemples qui utilisent Get-ChildItem et la pipe à Supprimer-article , mais les exemples suppriment généralement un ensemble de fichiers basés sur un filtre, pas le répertoire entier.

je cherche le moyen le plus propre pour souffler un entier répertoire, fichiers et répertoires d'enfants, sans générer de messages d'avertissement de l'utilisateur en utilisant le moins de code possible. Une doublure unique serait bien si elle était facile à comprendre.

220
demandé sur Peter Mortensen 2009-11-18 02:43:39

16 réponses

Remove-Item -Recurse -Force some_dir

fonctionne effectivement comme annoncé ici.

rm -r -fo some_dir

sont des alias abrégés qui fonctionnent aussi.

d'après ce que j'ai compris, le paramètre -Recurse ne fonctionne tout simplement pas correctement lorsque vous essayez de supprimer un ensemble de fichiers filtrés de façon récursive. Pour le meurtre d'un seul dir et tout ce qui semble bien fonctionner.

373
répondu Joey 2017-11-17 17:52:54

j'ai utilisé:

rm -r folderToDelete

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

31
répondu Tuan Jinn 2014-12-09 00:41:11

lors de la suppression de fichiers en utilisant récursivement 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'empêcher cette erreur individuelle de supprimer 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 articles avec pspath -Descending de sorte que les feuilles sont supprimées avant les racines. Le tri se fait sur le paramètre pspath car cela a plus de chances de fonctionner pour les fournisseurs autres que le système de fichiers. Le -Include paramètre 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 lançant

Get-Tree some_dir | select fullname
16
répondu John Rees 2018-05-08 21:22:28
rm -r ./folder -Force    

...a travaillé pour moi

9
répondu stevethecollier 2015-02-13 02:28:15

utilisez la commande DOS de la vieille école:

rd /s <dir>
9
répondu Peter Mortensen 2015-10-20 17:19:56

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

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
8
répondu steve 2017-02-21 21:24:49

pour éviter les erreurs" the directory is not empty " de la réponse acceptée, utilisez simplement la bonne vieille commande DOS comme suggéré précédemment. La syntaxe complète de PS prête à copier-coller est:

& cmd.exe /c rd /S /Q $folderToDelete
6
répondu Dejan 2016-02-26 12:54:08

Pour une raison quelconque John Rees réponse parfois ne fonctionne pas dans mon cas. Mais ça m'a mené dans la direction suivante. Tout d'abord, j'essaie de supprimer le répertoire de façon récursive avec l'option buggy-recurse. Ensuite je descends dans chaque sous-DIR qui reste et efface 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
        }
    }
}
5
répondu jdoose 2015-07-16 09:34:44

j'ai pris une autre approche inspirée de @john-rees ci - dessus-surtout quand son approche a commencé à échouer pour moi à un moment donné. Fondamentalement, récupérez les fichiers de sous-arborescence et les Trier par leur chemin-longueur-Supprimer de la plus longue à la plus courte

Get-ChildItem $tfsLocalPath -Recurse |  #Find all children
    Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} |  #Calculate the length of their path
    Sort-Object PathLength -Descending | #sort by path length descending
    %{ Get-Item -LiteralPath $_.FullName } | 
    Remove-Item -Force

en ce qui concerne la-magie LiteralPath, voici un autre gotchya qui pourrait vous frapper: https://superuser.com/q/212808

2
répondu Peter McEvoy 2017-03-20 10:04:24

Really simple:

remove-item -path <type in file or directory name>, press Enter
1
répondu DusanV 2014-12-09 00:41:58

une autre astuce utile:

si vous trouvez beaucoup de fichiers avec la même convention de nom ou une convention similaire (comme un fichier mac avec un nom de préfixe de point... cette célèbre pulltion de fichier), vous pouvez facilement les supprimer avec une seule ligne de la powershell comme ceci:

ls -r .* | rm

Cette ligne va supprimer tous les fichiers avec un point au début du nom dans le répertoire courant et tous les fichiers avec les mêmes circonstances à l'intérieur d'autres dossiers dans ce répertoire aussi. Être conscient lors de son utilisation. : D

1
répondu Daniel Alberto Lepe Ayala 2016-05-07 23:59:17

supprimer un arbre de dossiers entier fonctionne parfois et échoue parfois avec des erreurs "Directory not empty". Par la suite, tenter 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 certains points de vue peuvent être obtenus de ce StackOverflow affichage .

j'ai pu contourner ces problèmes en spécifiant l'ordre dans lequel les éléments dans le dossier sont supprimés, et en ajoutant des retards. Ce qui suit fonctionne bien pour moi:

# First remove any files in the folder tree
Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force

# Then remove any sub-folders (deepest ones first).    The -Recurse switch may be needed despite the deepest items being deleted first.
ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }

# Then remove the folder itself.  The -Recurse switch is sometimes needed despite the previous statements.
Remove-Item -LiteralPath $FolderToDelete -Recurse -Force

# Finally, give Windows some time to finish deleting the folder (try not to hurl)
Start-Sleep -Seconds 4

Un article Microsoft TechNet à l'Aide des Propriétés Calculées en PowerShell a été utile pour moi d'en obtenir une liste des sous-dossiers triés en fonction de la profondeur.

des problèmes de fiabilité similaires avec RD / S / Q peuvent être résolus en lançant RD /S /Q deux fois-idéalement avec une pause entre (i.e. en utilisant ping comme indiqué ci-dessous).

RD /S /Q "C:\Some\Folder\to\Delete" > nul
if exist "C:\Some\Folder\to\Delete"  ping -4 -n 4 127.0.0.1 > nul
if exist "C:\Some\Folder\to\Delete"  RD /S /Q "C:\Some\Folder\to\Delete" > nul
1
répondu MikeOnline 2017-07-07 19:10:23

pour supprimer le contenu complet, y compris la structure du dossier, utiliser

get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}

le -recurse ajouté à remove-item assure que les messages-guides interactifs sont désactivés.

1
répondu steve simon 2017-07-13 07:35:07

utilisant des commutateurs PowerShell pour supprimer tous les fichiers et dossiers

Supprimer - Item-Path "C:\dotnet-helpers*.* "- récurse

revient fore vers le bas et trouve beaucoup plus de dossiers. Le paramètre - permettra à PowerShell de supprimer tout élément enfant sans demander la permission .De plus, le paramètre-force peut être ajouté pour supprimer les fichiers cachés ou en lecture seule.

à l'Aide de -commandement de la Force on peut supprimer des fichiers de la force entièrement

utilisant des commutateurs PowerShell pour supprimer complètement toute la force de fichier

Supprimer - Item-Path "C:\dotnet-helpers*.* "- Force

Avec exemple: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell /

0
répondu thiyagu selvaraj 2018-05-11 15:12:30
del <dir> -Recurse -Force # I prefer this, short & sweet

ou

remove-item <dir> -Recurse -Force

si vous avez un répertoire énorme alors ce que je fais habituellement est

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 est fait.

0
répondu Gajendra D Ambi 2018-07-24 10:30:07
$users = get-childitem \ServerName\c$\users\ | select -ExpandProperty name

foreach ($user in $users)

{
remove-item -path "\Servername\c$\Users$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
Write-Warning "$user Cleaned"
}

a écrit ce qui précède pour nettoyer quelques logfiles sans supprimer le répertoire parent et cela fonctionne parfaitement!

-1
répondu Tom Stevenson 2017-08-21 11:16:09