web-dev-qa-db-fra.com

Supprimer tous les fichiers et dossiers mais exclure un répertoire

J'ai un diectory où je dois supprimer tous les fichiers et dossiers sauf une petite liste de fichiers et dossiers.

Je peux déjà exclure une liste de fichiers, mais je ne vois pas un moyen d’exclure un dossier.

Voici la structure du dossier:

|-C:\temp
 \-C:\temp\somefile.txt
 \-C:\temp\someotherfile.txt
| |-C:\temp\foldertodelete
   \-C:\temp\foldertodelete\file1.txt
| |-C:\temp\foldertokeep
|  \-C:\temp\foldertokeep\file2.txt

Je veux conserver somefile.txt et le dossier foldertokeep et son contenu.

C'est ce que j'ai en ce moment:

Get-ChildItem -Path  'C:\temp' -Recurse -exclude somefile.txt | Remove-Item -force -recurse

Cela ne supprime pas somefile.txt. Est-il possible d'exclure le dossier foldertokeep et son contenu de la liste de suppression?

37
Mathias F
Get-ChildItem -Path  'C:\temp' -Recurse -exclude somefile.txt |
Select -ExpandProperty FullName |
Where {$_ -notlike 'C:\temp\foldertokeep*'} |
sort length -Descending |
Remove-Item -force 

Le commutateur -recurse ne fonctionne pas correctement avec Remove-Item (il essaiera de supprimer des dossiers avant que tous les éléments enfants du dossier aient été supprimés). Le fait de trier les noms complets par ordre décroissant par longueur permet de s’assurer qu’aucun dossier n’est supprimé avant que tous les éléments enfants du dossier n’aient été supprimés.

46
mjolinor

Dans PowerShell 3.0 et ci-dessous , vous pouvez simplement essayer ceci:

Remove-Item -recurse c:\temp\* -exclude somefile.txt,foldertokeep

À moins qu'il ne manque un paramètre, cela semble faire l'affaire ...

Edit: voir les commentaires ci-dessous, le comportement de Remove-Item a changé après la PS3, cette solution ne semble plus applicable.

23
Poorkenny

J'ai utilisé le ci-dessous et juste supprimé -Recurse de la 1ère ligne et il laisse tous les fichiers et sous-dossiers sous la liste des dossiers exclus.

   Get-ChildItem -Path "PATH_GOES_HERE" -Exclude "Folder1", "Folder2", "READ ME.txt" | foreach ($_) {
       "CLEANING :" + $_.fullname
       Remove-Item $_.fullname -Force -Recurse
       "CLEANED... :" + $_.fullname
   }
7
Dave D

J'utilise cette approche en supposant que vous souhaitiez exclure certains fichiers ou dossiers au niveau de la racine, mais que vous souhaitiez ensuite tout supprimer en leur sein.

C:.
├───delme1
│   │   delme.txt
│   │
│   └───delmetoo
├───delme2
├───folder1
│       keepmesafe.txt
│
└───folder2

Donc, vous voulez tout supprimer et préserver le dossier1 et le dossier2

Get-ChildItem -Exclude folder1,folder2 | Remove-Item -Recurse -Force

Il existe de nombreuses autres solutions mais j'ai trouvé cela facile à comprendre et à retenir.

4
guillem

Je suis tombé dessus et j'ai trouvé une commande d'une ligne qui fonctionne pour moi. Il supprimera tous les dossiers et fichiers du répertoire en question, tout en conservant quoi que ce soit dans la liste "exclus". Il est également silencieux afin de ne pas renvoyer d'erreur si certains fichiers sont en lecture seule ou en cours d'utilisation.

@powershell Remove-item C:\Random\Directory\* -exclude "MySpecialFolder", "MySecondSpecialFolder" -force -erroraction 'silentlycontinue'
3
TechnicianOnline

Cela aiderait aussi quelqu'un ...

L'ajout d'une variable vide ou non définie auparavant pour PATH_GOES_HERE peut entraîner une suppression récursive dans le répertoire utilisateur (ou C:\windows\system32 si le script est exécuté en tant qu'administrateur). J'ai découvert cela à la dure et j'ai dû réinstaller Windows.

Essayez vous-même! (ci-dessous ne sortira que les répertoires de fichiers dans un fichier test.txt)

Get-ChildItem -Path $dir2 -Recurse -Exclude "Folder1 ", FileName.txt | foreach ($_) {
$_.fullname >> C:\temp\test.txt
}
2
Mike

Selon MSDNRemove-Item a un problème connu avec le paramètre -exclude. Utilisez cette variante à la place.

Get-ChildItem * -exclude folderToExclude | Remove-Item
2
Andrew Young

J'ai utilisé ça, ça marche parfaitement pour moi

Get-ChildItem -Path 'C:\Temp\*' -Recurse | Where-Object {($_.FullName -notlike "*windirstat*") -and ($_.FullName -notlike "C:\Temp\GetFolderSizePortable*")} | Remove-Item -Recurse
1
Fredrik L

Oui, je sais que c'est un vieux fil. Je ne pouvais obtenir aucune des réponses ci-dessus pour travailler dans Powershell 5, alors voici ce que j'ai découvert:

Get-ChildItem -Path $dir -Exclude 'name_to_ignore' |
ForEach-Object {Remove-Item $_ -Recurse }

Cela déplace le -Recurse to Remove-Item au lieu de où les éléments sont trouvés.

0
Paw Baltzersen

Cela aiderait aussi quelqu'un ...

Get-ChildItem -Path PATH_GOES_HERE -Recurse -Exclude "Folder1 ", "Folder2", FileName.txt | foreach ($_) {
    "CLEANING :" + $_.fullname
    Remove-Item $_.fullname -Force -Recurse
    "CLEANED... :" + $_.fullname
}
0
4u.Ans