Löschen Sie alle Dateien aus einem Ordner und seinen Unterordnern

52

Ich möchte alle Dateien aus einer Ordnerstruktur entfernen, daher verbleibt eine leere Ordnerstruktur.

Kann dies in Batch- oder VBScript- Skripten erreicht werden?

Ich habe einen sehr einfachen Batch-Befehl ausprobiert, aber dazu musste der Benutzer das Löschen jeder Datei zulassen. Dies war keine geeignete Lösung, da es viele hundert Dateien gibt, die mit der Zeit erheblich zunehmen werden.

Was können Sie vorschlagen?

BobJim
quelle
Du meinst ein rekursives Löschen? Dies kann in der Tat getan werden. Etwas wie rd /s /q "c:\folder awird eine rekursive Löschung aller Dateien und Ordner innerhalbFolder A
Ramhound
Ich weiß nicht, wie man ein Skript in Powershell erstellt, habe aber zuvor Powershell-Skripte ausgeführt.
BobJim
2
Jetzt ist ein perfekter Zeitpunkt zum Lernen, ich würde die Batch- und VBS-Syntax für ältere Zwecke untersuchen, aber mehr Zeit in das Erlernen von PS investieren.
MDMoore313
Ich hatte noch keine Gelegenheit, den Code zu überprüfen, obwohl ich mir sicher bin, dass er funktionieren wird. Ich werde zurückkommen und die am besten geeignete Antwort auf meine erste Anfrage auswählen.
BobJim
Ich werde @ BigHomies Empfehlung folgen - ich habe gerade PowerShell gelernt und muss sagen, dass es ziemlich ordentlich ist - nicht zu schwer, eine gute Waffe im Arsenal eines jeden Programmierers. Ich benutze es jetzt ziemlich häufig.
Ben

Antworten:

75

Dies kann mit PowerShell erreicht werden :

Get-ChildItem -Path C:\Temp -Include *.* -File -Recurse | foreach { $_.Delete()}

Dieser Befehl ruft jedes untergeordnete Element auf $path, führt die Löschmethode für jedes Element aus und ist recht schnell. Die Ordnerstruktur bleibt erhalten.

Wenn Sie Dateien ohne Erweiterung haben, verwenden Sie

Get-ChildItem -Path C:\Temp -Include * -File -Recurse | foreach { $_.Delete()}

stattdessen.

-FileMöglicherweise wurde der Parameter nach PowerShell v2 hinzugefügt. Wenn das der Fall ist, dann

Get-ChildItem -Path C:\Temp -Include *.* -Recurse | foreach { $_.Delete()}

Es sollte den Trick für Dateien tun, die eine Erweiterung haben.

Wenn dies nicht funktioniert, prüfen Sie , ob Sie über eine aktuelle Version von Powershell verfügen

MDMoore313
quelle
1
Es ist -Include *.*kein -Include .großer Unterschied! :-)
MDMoore313
Get-ChildItem -Path D: \ EmptyThisFolder -Include . -Datei -Recurse | foreach {$ _. Delete ()}
BobJim
Warum benutzt du -Include .? Das ist das Problem.
MDMoore313
2
Können sie nicht umsetzen powershell --version? Können sie keine Versionsnummer mit positiven Ziffern verwenden? Es ist nur verrückt. Mehr als 1300 Stimmen für eine Frage, wie man die Versionsnummer eines Programms herausfindet?
Thomas Weller
1
@demonicdaron soll es nicht; Die Frage des OP bestand darin , die Ordnerstruktur beizubehalten.
MDMoore313
24

Kurz und Suite PowerShell. Ich bin mir nicht sicher, mit welcher der niedrigsten PS-Versionen es funktionieren wird.

Remove-Item c:\Tmp\* -Recurse -Force
Evan Nadeau
quelle
2
Schön und leicht. Dies hat den Trick getan, während die akzeptierte Antwort dies nicht tat!
Demonicdaron
Dies sollte die akzeptierte Antwort sein, Sie können sie sogar einfach eingeben, rm *da es nicht wirklich ratsam ist, sie zu erzwingen (das Bestätigungsdialogfeld enthält ohnehin die Option "Ja zu allen").
J Garcia
22

Sie können dies mit dem delBefehl tun :

dir C:\folder
del /S *

Der /SSchalter dient zum rekursiven Löschen von Dateien.

phoops
quelle
2
Wird dies nur Dateien löschen, aber die Ordner verlassen?
BobJim
5
Ja. Sie können eine /POption hinzufügen, sodass Sie aufgefordert werden, jedes Löschen zu bestätigen, um dies zu überprüfen.
Phoops
Vielen Dank, ich werde es versuchen! hoffentlich viel Zeit sparen!
BobJim
3
Ja. Zum Löschen von versteckten Dateien und Systemdateien müssen Sie attrib -s -r -h Folder\*.* /s /dvor dem Löschen vorgehen. Und für Berechtigungen verwenden Sie den takeownBefehl.
Jet
2
Und Sie können / Q verwenden, um bei Verwendung von Platzhaltern KEINE Bestätigung anzufordern.
Aylatan
4

Wenn ich zwischen den Zeilen Ihrer ursprünglichen Frage lese, kann ich eine alternative BATCH-Codezeile anbieten, die Sie verwenden können. Beim Ausführen werden nur Dateien gelöscht, die älter als 60 Tage sind. Auf diese Weise können Sie dies in eine geplante Aufgabe einfügen, und wenn sie ausgeführt wird, werden die überschüssigen Dateien gelöscht, die Sie nicht benötigen, anstatt das gesamte Verzeichnis wegzublasen. Sie können 60 bis 5 Tage oder sogar 1 Tag ändern, wenn Sie wollten. Hiermit werden keine Ordner gelöscht.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"
Travis
quelle
Vielen Dank für die Idee, aber derzeit denke ich, dass der "Entleerungs" -Prozess in einem sehr ungeplanten Ad-hoc-Zeitrahmen abgeschlossen sein wird. Ich werde diesen Code jedoch für die Zukunft aufbewahren! Prost
BobJim
Der Titel lautet "Alle Dateien aus einem Ordner und seinen Unterordnern löschen", daher ist dies keine Lösung.
Anders Lindén
4

Verwenden von PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 
Gregory Suvalian
quelle
3

Verwenden Sie PowerShell, um eine einzelne Datei oder einen Ordner zu löschen. Bevor wir den Befehl Löschen in Powershell ausführen, müssen wir sicherstellen, dass Sie auf dem Server oder PC mit einem Konto angemeldet sind, das uneingeschränkten Zugriff auf die zu löschenden Objekte hat.

Mit Beispiel: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

Verwenden von PowerShell-Commnads zum Löschen einer Datei

Remove-Item -Path "C: \ dotnet-helpers \ DummyfiletoDelete.txt"

Mit dem obigen Befehl wird die Datei "DummyfiletoDelete.txt" ausgeführt und gelöscht, die sich im Verzeichnis "C: \ dotnet-helpers" befindet.

Verwenden von PowerShell-Commnads zum Löschen aller Dateien

Remove-Item -Path "C: \ dotnet-helpers *. *"

Verwenden von PowerShell-Commnads zum Löschen aller Dateien und Ordner

Remove-Item -Path "C: \ dotnet-helpers *. *" -Recurse

-recurseDrilldown und findet viel mehr Dateien. Mit diesem –recurseParameter kann PowerShell untergeordnete Elemente entfernen, ohne um Erlaubnis zu bitten. Darüber hinaus kann der Parameter –force hinzugefügt werden, um versteckte oder schreibgeschützte Dateien zu löschen.

Verwenden des Befehls -Force zum erzwungenen Löschen von Dateien

Verwenden des PowerShell-Befehls zum erzwungenen Löschen aller Dateien

Remove-Item -Path "C: \ dotnet-helpers *. *" -Force

Thiyagu Selvaraj
quelle
1

Versuchen Sie dies mit PowerShell. In diesem Beispiel möchte ich alle .class-Dateien löschen:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}
Boubakr
quelle
1
  1. Wählen Sie im Windows Explorer das Stammverzeichnis mit allen Dateien und Ordnern.

  2. Suchen nach *

  3. Nach Typ sortieren (Alle Ordner befinden sich oben und alle Dateien darunter)

  4. Wählen Sie alle Dateien aus und drücken Sie Löschen.

Dadurch werden alle Dateien gelöscht und die Verzeichnisstruktur beibehalten.

Emel
quelle
1

Löschen Sie alle Dateien aus dem aktuellen Verzeichnis und den Unterverzeichnissen, ohne die Ordnerstruktur zu verlassen.

Mit dem /QSchalter ( ) wird der Benutzer gefragt, ob er löschen darf

Achtung : Probieren Sie es aus, ohne /Qsicherzustellen, dass Sie nichts Wertvolles löschen.

del /S * /Q 
hdoghmen
quelle
1

Dies ist der einfachste Weg, IMO

Öffnen Sie PowerShell, navigieren Sie zu dem Verzeichnis ( cd), DANN

ls -Recurse * | rm

(Poof) alles ist weg ...

Wenn Sie basierend auf einer bestimmten Erweiterung löschen möchten

ls -Recurse *.docx | rm

ls listet das Verzeichnis auf

-Recurse ist eine Flagge, die Powershell anweist, in Unterverzeichnisse zu wechseln

* sagt alles

*.doc alles mit .doc extension

| Zuführung der Ausgabe von links nach rechts

rm löschen

Alle anderen Antworten scheinen dies verwirrender als nötig zu machen.

Kolob Canyon
quelle
0
dir C:\testx\ -Recurse -File | rd -WhatIf
What if: Performing the operation "Remove File" on target "C:\testx\x.txt".
What if: Performing the operation "Remove File" on target "C:\testx\bla\x.txt".
bertieb
quelle
-1

Als Ergänzung zu den obigen Antworten ist es nicht erforderlich, das Get-Childitem zu verwenden und das Ergebnis in den obigen Antworten an die Pipeline zu übergeben, da das Schlüsselwort -Include im Befehl Remove-Item enthalten ist

Man kann einfach:

Remove-Item -Include " . " "C: \ Temp" -Recurse

Sams0nT
quelle