it-swarm.com.de

Löschen Sie alle Dateien und Ordner, schließen Sie jedoch ein Verzeichnis aus

Ich habe eine Datenbank, in der ich alle Dateien und Ordner mit Ausnahme einer kleinen Liste von Dateien und Ordnern löschen muss.

Ich kann bereits eine Liste von Dateien ausschließen, sehe aber keine Möglichkeit, einen Ordner auszuschließen.

Hier ist die Ordnerstruktur:

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

Ich möchte somefile.txt und den Ordner foldertokeep und seinen Inhalt behalten.

Das habe ich gerade jetzt:

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

Das löscht somefile.txt wirklich nicht. Gibt es eine Möglichkeit, Ordnerordner und seinen Inhalt von der Löschliste auszuschließen?

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 

Die Option -recurse funktioniert bei Remove-Item nicht ordnungsgemäß (es wird versucht, Ordner zu löschen, bevor alle untergeordneten Elemente im Ordner gelöscht wurden). Durch das Sortieren der vollständigen Namen in absteigender Reihenfolge nach Länge wird sichergestellt, dass kein Ordner gelöscht wird, bevor alle untergeordneten Elemente im Ordner gelöscht wurden.

46
mjolinor

In PowerShell 3.0 und unter können Sie einfach Folgendes versuchen:

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

Wenn es keinen Parameter gibt, den ich vermisse, scheint dies den Trick zu tun ...

Bearbeiten: siehe Kommentare unten, das Verhalten von Remove-Item hat sich nach PS3 geändert, diese Lösung scheint nicht mehr anwendbar zu sein.

23
Poorkenny

Ich habe die unten stehende und -Recurse aus der 1. Zeile entfernt und alle Dateien und Unterordner werden unter der Ausschlussordnerliste angezeigt.

   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

Ich wende diesen Ansatz an, vorausgesetzt, Sie möchten einige Dateien oder Ordner auf Root-Ebene ausschließen, aber dann möchten Sie alles darin löschen.

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

Sie möchten also alles löschen und Ordner1 und Ordner2 beibehalten

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

Es gibt viele andere Lösungen, aber ich fand es leicht zu verstehen und zu merken.

4
guillem

Ich bin darauf gestoßen und habe einen einzeiligen Befehl gefunden, der für mich funktioniert. Es löscht alle Ordner und Dateien in dem betreffenden Verzeichnis und behält alles auf der "ausgeschlossenen" Liste bei. Es ist auch stumm, so dass kein Fehler zurückgegeben wird, wenn einige Dateien schreibgeschützt sind oder verwendet werden.

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

Das würde auch jemandem helfen ...

Wenn Sie eine Variable für PATH_GOES_HERE hinzufügen, die leer ist oder nicht definiert wurde, kann dies zu einem rekursiven Löschen im Benutzerverzeichnis führen (oder C:\windows\system32, wenn das Skript als admin ausgeführt wird). Ich fand das auf die harte Tour heraus und musste Windows neu installieren.

Versuch es selber! (unten werden nur die Dateiverzeichnisse in eine test.txt ausgegeben)

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

Gemäß MSDN HATRemove-Item ein bekanntes Problem mit dem -exclude-Parameter. Verwenden Sie stattdessen diese Variante.

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

Ich habe das verwendet, das funktioniert perfekt für mich

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

Ja ich weiß das ist ein alter Thread. Ich konnte keine der obigen Antworten bekommen, um in Powershell 5 zu arbeiten, also habe ich Folgendes herausgefunden:

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

Dadurch wird -Recurse zu Remove-Item verschoben, anstatt an dem Ort, an dem sich die Elemente befinden.

0
Paw Baltzersen

Das würde auch jemandem helfen ...

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