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.
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.
j'ai utilisé:
rm -r folderToDelete
cela fonctionne pour moi comme un charme (je l'ai volé à Ubuntu).
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
utilisez la commande DOS de la vieille école:
rd /s <dir>
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
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
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
}
}
}
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
Really simple:
remove-item -path <type in file or directory name>, press Enter
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
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
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.
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 /
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.
$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!