471 Stimmen

Wie wird ein ganzes Verzeichnis mit PowerShell 2.0 rekursiv gelöscht?

Was ist die einfachste Methode, um ein Verzeichnis und alle seine Unterverzeichnisse in PowerShell zu löschen? Ich verwende PowerShell V2 unter Windows 7.

Ich habe aus verschiedenen Quellen erfahren, dass der offensichtlichste Befehl, Remove-Item $targetDir -Recurse -Force funktioniert nicht richtig. Dazu gehört auch eine Aussage in der PowerShell V2-Online-Hilfe (zu finden über Get-Help Remove-Item -Examples ), die besagt:

...Da der Recurse-Parameter in diesem Cmdlet fehlerhaft ist, verwendet der Befehl das Cmdlet "Get-Childitem", um die gewünschten Dateien abzurufen, und übergibt sie mit dem Pipelineoperator an das Cmdlet "Remove-Item"...

Ich habe verschiedene Beispiele gesehen, die Folgendes verwenden Get-ChildItem und leiten es an Entfernen-Element aber die Beispiele entfernen in der Regel eine Reihe von Dateien auf der Grundlage eines Filters, nicht das gesamte Verzeichnis.

Ich bin auf der Suche nach dem saubersten Weg, um ein ganzes Verzeichnis, Dateien und untergeordnete Verzeichnisse auszublasen, ohne irgendwelche Benutzerwarnungen zu generieren und dabei so wenig Code wie möglich zu verwenden. Ein Einzeiler wäre schön, wenn er leicht zu verstehen ist.

795voto

Joey Punkte 329386
Remove-Item -Recurse -Force some_dir

funktioniert tatsächlich so, wie es hier beschrieben wird.

rm -r -fo some_dir

sind Kurzbezeichnungen, die ebenfalls funktionieren.

Soweit ich das verstanden habe, ist die -Recurse funktioniert einfach nicht richtig, wenn Sie versuchen, eine gefilterte Gruppe von Dateien rekursiv zu löschen. Beim Löschen eines einzelnen Verzeichnisses und allem, was darunter liegt, scheint es gut zu funktionieren.

46voto

Tuan Jinn Punkte 629

Ich benutzte:

rm -r folderToDelete

Das funktioniert bei mir ganz hervorragend (ich habe es von Ubuntu geklaut).

34voto

John Rees Punkte 1253

Beim rekursiven Löschen von Dateien mit einer einfachen Remove-Item "folder" -Recurse Ich sehe manchmal einen intermittierenden Fehler: [folder] cannot be removed because it is not empty.

Mit dieser Antwort wird versucht, diesen Fehler zu verhindern, indem die Dateien einzeln gelöscht werden.

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

Ein wichtiges Detail ist die Sortierung aller Artikel mit pspath -Descending so dass die Blätter vor den Wurzeln gelöscht werden. Die Sortierung erfolgt nach der pspath Parameter zu verwenden, da dieser bei anderen Anbietern als dem Dateisystem eher funktionieren kann. Der -Include ist nur ein Hilfsmittel, wenn Sie die zu löschenden Elemente filtern wollen.

Es ist in zwei Funktionen aufgeteilt, da ich es nützlich finde, zu sehen, was ich gerade lösche, indem ich

Get-Tree some_dir | select fullname

17voto

stevethecollier Punkte 934
rm -r ./folder -Force    

...hat bei mir funktioniert

14voto

mikey Punkte 790

Wenn Sie mit Powershell arbeiten, können Sie dies verwenden, wie in der akzeptierten Antwort erläutert:

rm -r -fo targetDir

Ich habe jedoch festgestellt, dass es schneller geht, wenn ich die Windows-Eingabeaufforderung verwende

rmdir /s/q targetDir

Die Option für die Eingabeaufforderung ist nicht nur schneller, sondern hat auch den Vorteil, dass sie sofort mit dem Löschen von Dateien beginnt (die Powershell führt zuerst eine Aufzählung durch). Wenn also etwas kaputt geht, während sie ausgeführt wird, haben Sie zumindest einige Fortschritte beim Löschen von Dateien gemacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X