Was ist der einfachste Weg, um ein Verzeichnis und alle seine Unterverzeichnisse in PowerShell zwangsweise zu löschen? Ich verwende PowerShell V2 in Windows 7.
Ich habe aus mehreren Quellen erfahren, dass der offensichtlichste Befehl Remove-Item $targetDir -Recurse -Force
nicht richtig funktioniert. Dies beinhaltet eine Anweisung in der PowerShell V2-Onlinehilfe (gefunden mit 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 mithilfe des Pipeline-Operators an das Cmdlet Remove-Item ...
Ich habe verschiedene Beispiele gesehen, die Get-ChildItem verwenden und an Remove-Item weiterleiten , aber die Beispiele entfernen normalerweise einige Dateien, die auf einem Filter basieren, nicht das gesamte Verzeichnis.
Ich suche nach dem saubersten Weg, ein ganzes Verzeichnis, Dateien und untergeordnete Verzeichnisse auszublasen, ohne Benutzerwarnmeldungen mit der geringsten Menge an Code zu generieren. Ein Einzeiler wäre schön, wenn es leicht zu verstehen wäre.
quelle
RD /S /Q
rd
ist ein Alias fürRemove-Item
in Powershell.cmd /c "rd /s /q"
funktioniert aber.Antworten:
funktioniert in der Tat wie hier angegeben.
sind Kurzform-Aliase, die auch funktionieren.
Soweit ich es verstanden habe,
-Recurse
funktioniert der Parameter einfach nicht richtig, wenn Sie versuchen, einen gefilterten Satz von Dateien rekursiv zu löschen. Um ein einzelnes Verzeichnis und alles darunter zu töten, scheint es gut zu funktionieren.quelle
cmd /c rd
wie unten angegeben.Ich benutzte:
Das funktioniert für mich wie ein Zauber (ich habe es Ubuntu gestohlen).
quelle
rm
ist ein Alias fürRemove-Item
in der Standardkonfiguration von PowerShell. Überprüfen Sie die Ausgabe vonGet-Alias rm
für weitere Details. Das-r
nutzt das teilweise Übereinstimmungsverhalten von PowerShell für Parameter. DaRemove-Item
nur der eine Parameter mit einem 'r' beginnt-Recurse
,-r
stimmt dieser überein. So funktioniert die folgend alle gleich:rm -r
,rm -re
,Remove-Item -Recurse
. (Beachten Sie, dass wederrm -rf
nochrm -r -f
funktioniert, sondernrm -r -fo
wird.-rf
-f
rm -rf folder
und natürlich ist es fehlgeschlagen. Ich habe die Antwort zunächst abgelehnt (weil dort Ubuntu stand). Dank des Kommentars von @chwarr habe ich es ohne das versuchtf
und es hat den Alias und nicht die rm-Binärdatei übernommen. Ich wünschte, Tuan würde seine Quelle aktualisieren (nicht sicher, ob Tuan wusste, dass es ein Alias war oder wirklich dachte, es sei das Unix rm ;-)-R
anstelle von verwende-r
(obwohl PowerShell meines Wissens wie der Rest von Windows nicht zwischen Groß- und Kleinschreibung unterscheidet, daher sollte es keinen Unterschied machen), aber ich habe einen Fehler erhalten, dass die Ordner, die ich löschen möchte, sind nicht leer.Beim rekursiven Löschen von Dateien mit einer einfachen Datei wird
Remove-Item "folder" -Recurse
manchmal ein zeitweiliger Fehler angezeigt:[folder] cannot be removed because it is not empty.
Diese Antwort versucht, diesen Fehler zu verhindern, indem die Dateien einzeln gelöscht werden.
Ein wichtiges Detail ist die Sortierung aller Elemente mit,
pspath -Descending
damit die Blätter vor den Wurzeln gelöscht werden. Die Sortierung erfolgt nach dempspath
Parameter, da dies eine größere Chance hat, für andere Anbieter als das Dateisystem zu arbeiten. Der-Include
Parameter ist nur eine Annehmlichkeit, wenn Sie die zu löschenden Elemente filtern möchten.Es ist in zwei Funktionen unterteilt, da ich es nützlich finde, zu sehen, was ich durch Ausführen löschen möchte
quelle
remove-item -recurse
in Powershell v5, daher ist diese Lösung am besten für mich.... hat für mich gearbeitet
quelle
Versuchen Sie dieses Beispiel. Wenn das Verzeichnis nicht vorhanden ist, wird kein Fehler ausgelöst. Möglicherweise benötigen Sie PowerShell v3.0.
quelle
Verwenden Sie den DOS-Befehl der alten Schule:
quelle
/q
(Ruhiger Modus, fragen Sie nicht, ob es in Ordnung ist, einen Verzeichnisbaum mit / S zu entfernen).Aus irgendeinem Grund funktionierte John Rees 'Antwort in meinem Fall manchmal nicht. Aber es führte mich in die folgende Richtung. Zuerst versuche ich das Verzeichnis rekursiv mit der Option buggy -recurse zu löschen. Danach gehe ich in jedes verbleibende Unterverzeichnis und lösche alle Dateien.
quelle
Um die Fehler "Das Verzeichnis ist nicht leer" der akzeptierten Antwort zu vermeiden, verwenden Sie einfach den guten alten DOS-Befehl, wie zuvor vorgeschlagen. Die vollständige PS-Syntax zum Einfügen von Kopien lautet:
quelle
Ich habe einen anderen Ansatz gewählt, der von @ john-rees oben inspiriert wurde - besonders als sein Ansatz irgendwann für mich zu scheitern begann. Verwenden Sie den Teilbaum grundsätzlich und sortieren Sie die Dateien nach ihrer Pfadlänge - löschen Sie vom längsten zum kürzesten
In Bezug auf die -LiteralPath-Magie ist hier eine weitere Gotchya, die Sie möglicherweise trifft: https://superuser.com/q/212808
quelle
ODER
Wenn Sie ein riesiges Verzeichnis haben, mache ich das normalerweise
Führen Sie dies auf einem anderen Powershell-Terminal aus und es wird gestoppt, wenn es fertig ist.
quelle
Das Löschen eines gesamten Ordnerbaums funktioniert manchmal und schlägt manchmal mit den Fehlern "Verzeichnis nicht leer" fehl. Der anschließende Versuch, zu überprüfen, ob der Ordner noch vorhanden ist, kann zu Fehlern "Zugriff verweigert" oder "Nicht autorisierter Zugriff" führen. Ich weiß nicht, warum dies passiert, obwohl aus diesem StackOverflow-Beitrag einige Erkenntnisse gewonnen werden können .
Ich konnte diese Probleme umgehen, indem ich die Reihenfolge festlegte, in der Elemente im Ordner gelöscht werden, und Verzögerungen hinzufügte. Folgendes läuft gut für mich:
Ein Microsoft TechNet-Artikel mit berechneten Eigenschaften in PowerShell war hilfreich, um eine Liste der Unterordner nach Tiefe zu sortieren.
Ähnliche Zuverlässigkeitsprobleme mit RD / S / Q können gelöst werden, indem DEL / F / S / Q vor RD / S / Q ausgeführt und der RD bei Bedarf ein zweites Mal ausgeführt wird - idealerweise mit einer Pause dazwischen (dh mit Ping wie gezeigt) unten).
quelle
Ganz einfach:
quelle
Ein weiterer nützlicher Trick:
Wenn Sie viele Dateien mit derselben oder einer ähnlichen Namenskonvention finden (wie eine Mac-Datei mit einem Punktpräfixnamen ... diese berühmte Datei), können Sie sie einfach mit einer einzigen Zeile aus der Powershell entfernen:
In dieser Zeile werden alle Dateien mit einem Punkt am Anfang des Namens im aktuellen Verzeichnis und alle Dateien mit denselben Umständen auch in anderen Ordnern in diesem Verzeichnis entfernt. Seien Sie sich dessen bewusst, wenn Sie es verwenden. : D.
quelle
rm -rf .*
? Ich habe keine Powershell zum Testen, aber ich denke, es wird funktionieren.Verwenden Sie zum Löschen des gesamten Inhalts einschließlich der Ordnerstruktur
Das
-recurse
Hinzufügen zuremove-item
stellt sicher, dass interaktive Eingabeaufforderungen deaktiviert sind.quelle
Schrieb das Obige, um einige Protokolldateien zu bereinigen, ohne das übergeordnete Verzeichnis zu löschen, und dies funktioniert perfekt!
quelle
quelle