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?
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.
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.
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
}
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.
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'
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
}
Selon MSDNRemove-Item
a un problème connu avec le paramètre -exclude
. Utilisez cette variante à la place.
Get-ChildItem * -exclude folderToExclude | Remove-Item
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
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.
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
}