So löschen Sie Dateien / Unterordner in einem bestimmten Verzeichnis an der Eingabeaufforderung in Windows

308

Angenommen, es gibt eine Variable mit dem Namen %pathtofolder%, da deutlich wird, dass es sich um einen vollständigen Pfad eines Ordners handelt.

Ich möchte jede einzelne Datei und jeden Unterordner in diesem Verzeichnis löschen, aber nicht das Verzeichnis selbst.

Möglicherweise liegt jedoch ein Fehler wie "Diese Datei / dieser Ordner wird bereits verwendet" vor. In diesem Fall sollte die Datei / der Ordner einfach fortgesetzt und übersprungen werden.

Gibt es dafür einen Befehl?

Deniz Zoeteman
quelle
Mögliches Duplikat von Was ist jemals mit Deltree passiert und was ist sein Ersatz?
Rosberg Linhares
Es ist verrückt, wie schwierig Windows das Löschen von Ordnern macht ... oder einen, der mit einem Punkt beginnt ... Gott sei Dank für die Bash-Integration in Windows! rm -rf path\to\folderfunktioniert in Windows 10 (oder könnte von Git Bash kommen ... so oder so, wenn Sie haben, dass es ein Versuch ist!)
Stijn de Witt

Antworten:

256

Mit diesem Shell-Skript können Sie den Ordner und die Dateien in der C:\Temp Quelle bereinigen :

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

Erstellen Sie eine Batchdatei (z. B. delete.bat) mit dem obigen Befehl. Gehen Sie zu dem Speicherort, an dem sich die Datei delete.bat befindet, und führen Sie den folgenden Befehl aus: delete.bat

Iain
quelle
20
Ich habe es versucht, aber leider wurden Dateien nicht gelöscht, nur die Unterordner werden gelöscht. Zum Beispiel habe ich einen Ordner namens Test. Es enthält 2 Ordner mit den Namen "Ripon" und "Wasim" und eine Datei mit dem Namen "riponalwasim.txt". Die Unterordner Ripon und Wasim wurden gelöscht, riponalwasim.txt wurde jedoch nicht gelöscht.
Ripon Al Wasim
16
Verwenden Sie ein einzelnes Prozentzeichen, wenn Sie direkt von der Befehlszeile aus ausführen möchten, z. B.%p
Alex
2
Schade, dass dies 2 Zeilen dauert, aber zumindest funktioniert es! Ich bin es leid, nach einem funktionierenden "Einzeiler" zu suchen und werde mit diesem gehen, danke!
Nightcoder
2
Mit dem Operator '&&' können Sie zwei Befehle in einer Zeile ohne Bat-Datei ausführen (beachten Sie das einzelne '%' anstelle von '%%'). del / s / q "meinordner *" && FOR / D% p IN ("meinordner *") DO rmdir "% p" / s / q
ravinsp
<for / F "delims =" %% i in ('dir / b / a-d') do (echo del "%% i" / q)> könnte für die Dateien helfen (entfernen Sie einfach dieses Echo)
grenix
340

rmdir ist mein absoluter Lieblingsbefehl für diesen Job. Es funktioniert zum Löschen großer Dateien und Ordner mit Unterordnern. Es wird keine Sicherung erstellt. Stellen Sie daher sicher, dass Sie Ihre Dateien sicher kopiert haben, bevor Sie diesen Befehl ausführen.

RMDIR "FOLDERNAME" /S /Q

Dadurch werden der Ordner sowie alle Dateien und Unterordner unbemerkt entfernt.

Suresh
quelle
65
Dies scheint den Pathtofolder zu entfernen, den das OP behalten wollte.
Fuzz Evans
4
Dadurch würde der Ordner selbst entfernt, sodass Sie einen weiteren Befehl hinzufügen müssen: md FOLDERNAME(siehe Antwort von @rakoczyn unten).
Donnerstag,
4
Was meinst du hier mit "Backup wird erstellt"? Ich kann nichts sehen, was irgendeine Art von Backup erstellen würde ...
Paul Groke
1
Das Verzeichnis ist nicht leer Nachricht kam als Antwort!
Jamshaid Kamran
10
Um den Ordner selbst nicht zu entfernen, machen Sie ihn vorher zum aktuellen Verzeichnis und verwenden Sie dann "." als ORDNER. Das anschließende erneute Erstellen ist nicht unbedingt dasselbe, da ACLs verloren gehen können. cd "FOLDERNAME" RD . /S /Q
Moritz Beide
85

Die einfachste Lösung, die ich mir vorstellen kann, ist das Entfernen des gesamten Verzeichnisses mit

RD /S /Q folderPath

Dann erstellen Sie dieses Verzeichnis erneut:

MD folderPath
wojciech_rak
quelle
5
Was ist, wenn Sie die Erlaubnis zum Löschen, aber nicht zum Erstellen neuer Ordner haben? Ich hoffe es ist möglich :)
Sandy
13
Dies ist eine schlechte Lösung, da dadurch ein Rennen im Dateisystem für den Verzeichnisknoten eingeführt wird, dh der zweite Befehl kann fehlschlagen, wenn er unmittelbar danach ausgeführt wird.
Rok Strniša
22
Auch schlechte Lösung, wenn das Verzeichnis spezielle Berechtigungen hat, haben Sie gerade ahem (whoops) nuked
Immortal Blue
Lassen Sie sich nicht von der Antwort abschrecken: 'Das Verzeichnis ist nicht leer.', Geben Sie den Befehl einfach zweimal aus :-)
Kieran Ryan
1
RD und RMDIR sind der gleiche Befehl. Da Sie diese Antwort 9 Monate nach der gleichen Antwort veröffentlicht haben, warum geben Ihnen die Leute Punkte?
Wechseln Sie am
51

Dadurch werden die Ordner und Dateien entfernt und der Ordner bleibt zurück.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
foxidrive
quelle
4
Für alle, die sich bei diesem Ansatz nicht sicher sind: Das Verzeichnis wird definitiv nicht neu erstellt. Ohne 2>nulgibt es aus "Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird."
Rok Strniša
6
Ich hasse es, dass Windows keine Dateien und Ordner löschen kann, die von einem Programm verwendet werden. Und ich liebe es, dass Sie das zu Ihren Gunsten in diesem Einzeiler verwendet haben.
andref
Also diese Übermagie ist, wie wir einen Ordner in Windows leeren? Beeindruckend :)
mlvljr
3
@mlvljr Nur wenn Sie auch den übergeordneten Ordner behalten möchten. RD /?zeigt Ihnen die einfache Möglichkeit, einen Ordner zu leeren.
foxidrive
1
Dies ist schön, wenn Sie zu Ihrem Startort zurückkehren müssen, sonst CD mypath && RD /S .würde es einfach ausreichen. Ich mag es nicht, dass Sie Ihren Pfad zweimal wiederholen müssen, für lange Pfade wird es schwer zu lesen. Also würde ich set p="mypath"am Anfang einfach ein hinzufügen .
Amit Naidu
39
@ECHO OFF

SET THEDIR=path-to-folder

Echo Deleting all files from %THEDIR%
DEL "%THEDIR%\*" /F /Q /A

Echo Deleting all folders from %THEDIR%
FOR /F "eol=| delims=" %%I in ('dir "%THEDIR%\*" /AD /B 2^>nul') do rd /Q /S "%THEDIR%\%%I"
@ECHO Folder deleted.

EXIT

... löscht alle Dateien und Ordner unter dem angegebenen Verzeichnis, jedoch nicht das Verzeichnis selbst.

thepip3r
quelle
4
Dies sollte die richtige Antwort sein .. machen Sie es einfach .. deletemyfoldercontents.bat Datei .. Pop in Ihrem Pfad und es funktioniert wie ein Zauber ..
Timbrown
3
Die DEL- Befehlszeile verpasst die Option /A, auch Dateien mit verstecktem Attributsatz zu löschen, und %dir%\*sollte in doppelte Anführungszeichen gesetzt werden "%dir%\*", um auch für Verzeichnisse zu funktionieren, die ein Leerzeichen oder eines dieser Zeichen enthalten &()[]{}^=;!'+,`~. Die FOR- Befehlszeile sollte geändert werden, for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I"da FOR Verzeichnisse mit ausgeblendeten Attributen ignoriert. DIR mit Optionen /AD /Bgibt alle Verzeichnisse nur mit ihren Namen aus. Übrigens: dirist kein guter Name für eine Umgebungsvariable.
Mofi
1
löscht keinen Unterordner
RMiranda
1
@ RMiranda, in meinen Tests funktioniert es genau so, wie es das OP verlangt hat. Haben Sie einen Fall, in dem die Unterordner nicht gelöscht werden?
Thepip3r
Behebt diese Antwort die Anforderung "Möglicherweise liegt ein Fehler wie" Diese Datei / dieser Ordner wird bereits verwendet "vor. In diesem Fall sollte sie einfach fortgesetzt und diese Datei / diesen Ordner übersprungen werden." ?
Peter Mortensen
30
CD [Your_Folder]
RMDIR /S /Q .

Sie erhalten eine Fehlermeldung, dass der RMDIR-Befehl nicht auf den aktuellen Ordner zugreifen und ihn daher nicht löschen kann.

Update :

Aus diesem nützlichen Kommentar (dank Moritz Both ) können Sie &&dazwischen hinzufügen , sodass er RMDIRnicht ausgeführt wird, wenn der CDBefehl fehlschlägt (z. B. falsch eingegebener Verzeichnisname):

CD [Your_Folder] && RMDIR /S /Q .

Aus der Windows-Befehlszeilenreferenz :

/ S: Löscht einen Verzeichnisbaum (das angegebene Verzeichnis und alle seine Unterverzeichnisse, einschließlich aller Dateien).

/ F: Legt den Ruhemodus fest. Fordert beim Löschen eines Verzeichnisbaums nicht zur Bestätigung auf. (Beachten Sie, dass / q nur funktioniert, wenn / s angegeben ist.)

O.Badr
quelle
1
Dies ist perfekt zum Entleeren der Temperatur, aber das cd [Your_Folder]ist sehr wichtig - ich muss mich daran erinnern, damit ich das Verzeichnis selbst nicht lösche ...
Salbei
5
Dies ist die richtige Lösung. Fügen Sie &&zwischen den Befehlen anstelle des Zeilenumbruchs hinzu, und Sie sind vor einer fehlerhaften CD sicher.
Moritz Beide
Dies ist eine einfache und korrekte Lösung. Funktioniert sogar mit der Azure-Befehlsshell!
Philippe
Ziemlich schlechte Lösung ... Ich brauche zum Beispiel diese Befehlszeilenlöschung für ein SVN-Update - Ich möchte alle Dateien und Ordner löschen, bevor ich das SVN-Update durchführe, da es auf dem Computer, auf dem ich dies verwende, möglicherweise einige Änderungen gibt, die jedoch relevant sind sind nur die eingecheckten Artikel. RMDIR / S / Q ausführen. entfernt auch den SVN-Link und macht den Ordner daher nicht mehr zu einem SVN-Ordner
Dominik Lemberger
Wie unterscheidet sich das von den vorherigen vier Antworten?
Peter Mortensen
9

RD steht für REMOVE Directory.

/ S: Löscht alle Dateien und Unterordner zusätzlich zum Ordner selbst. Verwenden Sie diese Option, um einen gesamten Ordnerbaum zu entfernen.

/ F: Leise - YN-Bestätigung nicht anzeigen

Beispiel:

RD /S /Q C:/folder_path/here
Sireesh Yarlagadda
quelle
1
dafür gestimmt, der einzige zu sein, der erklärt, was /S und/Q bedeutet
SourceVisor
2
Nein rdist äquivalent zu rmdirund entfernt das Verzeichnis selbst und ist nicht das, was OP will.
WesternGun
Behebt diese Antwort die Anforderung "Möglicherweise liegt ein Fehler wie" Diese Datei / dieser Ordner wird bereits verwendet "vor. In diesem Fall sollte die Datei / der Ordner einfach fortgesetzt und übersprungen werden." Bricht es zum Beispiel vollständig ab, anstatt fortzufahren?
Peter Mortensen
8

Ich benutze Powershell

Remove-Item c:\scripts\* -recurse

Der Inhalt des Ordners wird entfernt, nicht der Ordner selbst.

Rhellem
quelle
Die Antwort von Rhellem ist neu, aber es ist die einzige Antwort, die dies tatsächlich für mich tun wird. (Gewinnen Sie 8.1, nicht nach Wahl)
Philologon
2
Von der Batch-Befehlszeile:powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Rosberg Linhares
Beachten Sie, dass das "*" erforderlich ist, da sonst der Ordner entfernt wird.
Mhenry1384
7

Keine der am 01.06.2018 veröffentlichten Antworten, mit Ausnahme der einzelnen Befehlszeile von foxidrive , hat wirklich alle Dateien und alle Ordner / Verzeichnisse in gelöscht %PathToFolder%. Dies ist der Grund für das Posten einer weiteren Antwort mit einer sehr einfachen Befehlszeile zum Löschen aller Dateien und Unterordner eines Ordners sowie einer Batchdatei mit einer komplexeren Lösung, in der erklärt wird, warum alle anderen Antworten am 01.06.2018 mit DEL veröffentlicht wurden und FOR mit RD konnte einen Ordner nicht vollständig bereinigen.


Die einfache Einzelbefehlszeilenlösung, die natürlich auch in einer Batchdatei verwendet werden kann:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

Diese Befehlszeile enthält drei Befehle, die nacheinander ausgeführt werden.

Der erste Befehl PUSHD überträgt den aktuellen Verzeichnispfad auf den Stapel und macht den nächsten%PathToFolder% das aktuelle Verzeichnis zum Ausführen des Befehlsprozesses.

Dies funktioniert standardmäßig auch für UNC- Pfade, da Befehlserweiterungen standardmäßig aktiviert sind und in diesem Fall PUSHD erstellt einen temporären Laufwerksbuchstaben, der auf die angegebene Netzwerkressource verweist, und ändert dann das aktuelle Laufwerk und Verzeichnis mithilfe des neu definierten Laufwerksbuchstabens.

PUSHD gibt die folgende Fehlermeldung aus, um STDERR zu behandeln, wenn das angegebene Verzeichnis überhaupt nicht vorhanden ist:

Das System kann den angegebenen Pfad nicht finden.

Diese Fehlermeldung wird unterdrückt, indem sie 2>nulan das Gerät NUL umgeleitet wird .

Der nächste Befehl RD wird nur ausgeführt, wenn das Ändern des aktuellen Verzeichnisses für den aktuellen Befehlsprozess in das angegebene Verzeichnis erfolgreich war, dh das angegebene Verzeichnis überhaupt existiert.

Der Befehl RD mit den Optionen /Qund /Sentfernt leise ein Verzeichnis mit allen Unterverzeichnissen, auch wenn das angegebene Verzeichnis Dateien oder Ordner mit ausgeblendeten Attributen oder mit schreibgeschützten Attributen enthält. Das Systemattribut verhindert niemals das Löschen einer Datei oder eines Ordners.

Nicht gelöscht sind:

  1. Ordner, die als aktuelles Verzeichnis für einen laufenden Prozess verwendet werden. Der gesamte Ordnerbaum eines solchen Ordners kann nicht gelöscht werden, wenn ein Ordner als aktuelles Verzeichnis für einen laufenden Prozess verwendet wird.

  2. Dateien, die derzeit von einem laufenden Prozess geöffnet werden, wobei die Dateizugriffsberechtigungen für "Datei geöffnet" festgelegt sind, um das Löschen der Datei beim Öffnen durch die laufende Anwendung / den laufenden Prozess zu verhindern. Eine solche geöffnete Datei verhindert auch das Löschen des gesamten Ordnerbaums in der geöffneten Datei.

  3. Dateien / Ordner, für die der aktuelle Benutzer nicht über die erforderlichen Berechtigungen (NTFS) zum Löschen der Datei / des Ordners verfügt, wodurch auch das Löschen des Ordnerbaums in diese Datei / diesen Ordner verhindert wird.

Der erste Grund, warum ein Ordner nicht gelöscht wird, wird von dieser Befehlszeile verwendet, um alle Dateien und Unterordner des angegebenen Ordners zu löschen, nicht jedoch den Ordner selbst. Der Ordner wird vorübergehend zum aktuellen Verzeichnis für die Ausführung des Befehlsprozesses gemacht, wodurch das Löschen des Ordners selbst verhindert wird. Dies führt natürlich zur Ausgabe einer Fehlermeldung mit dem Befehl RD :

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

Datei ist hier der falsche Begriff, da der Ordner in Wirklichkeit von einem anderen Prozess verwendet wird, dem aktuellen Befehlsprozess, der den Befehl RD ausgeführt hat . Nun, in Wirklichkeit ein Ordner ist für das Dateisystem eine spezielle Datei mit Dateiattribut Verzeichnis , die diese Fehlermeldung erklärt. Aber ich möchte nicht zu tief in die Dateisystemverwaltung einsteigen.

Diese Fehlermeldung wird wie alle anderen Fehlermeldungen, die aus den drei oben genannten Gründen auftreten können, unterdrückt, indem sie 2>nulvom Handle STDERR zum Gerät NUL umgeleitet wird .

Der dritte Befehl, POPD , wird unabhängig vom Exit-Wert des Befehls RD ausgeführt .

POPD öffnet den von PUSHD geposteten Verzeichnispfad vom Stapel und ändert das aktuelle Verzeichnis zum Ausführen des Befehlsprozesses in dieses Verzeichnis, dh stellt das ursprüngliche aktuelle Verzeichnis wieder her. POPD löscht den von PUSHD erstellten temporären Laufwerksbuchstaben im Falle eines UNC- Ordnerpfads .

Hinweis: POPD kann das ursprüngliche aktuelle Verzeichnis möglicherweise nicht wiederherstellen, wenn das anfängliche aktuelle Verzeichnis ein Unterverzeichnis des zu bereinigenden Verzeichnisses war, das nicht mehr vorhanden ist. In diesem Sonderfall %PathToFolder%bleibt das aktuelle Verzeichnis. Es ist daher ratsam, die obige Befehlszeile nicht in einem Unterverzeichnis von auszuführen %PathToFolder%.

Eine weitere interessante Tatsache: Ich habe versucht, die Befehlszeile auch unter Verwendung eines UNC-Pfads zu verwenden, indem ich das lokale Verzeichnis C:\Tempmit dem Freigabenamen freigegeben Tempund den UNC-Pfad verwendet habe, \\%COMPUTERNAME%\Temp\CleanTestder der Umgebungsvariablen PathToFolderunter Windows 7 zugewiesen wurde . Wenn das aktuelle Verzeichnis beim Ausführen der Befehlszeile ein Unterverzeichnis eines freigegebenen lokalen Verzeichnisses ist Der Ordner, auf den über den UNC-Pfad zugegriffen wird C:\Temp\CleanTest\Subfolder1, Subfolder1wird von RD gelöscht , und das nächste POPD schlägt stillschweigend C:\Temp\CleanTest\Subfolder1das aktuelle Verzeichnis wieder her, sodass es Z:\CleanTestals aktuelles Verzeichnis für den ausgeführten Befehlsprozess verbleibt. In diesem ganz besonderen Fall bleibt der temporäre Laufwerksbuchstabe so lange bestehen, bis das aktuelle Verzeichnis beispielsweise mit geändert wirdcd /D %SystemRoot%in ein wirklich vorhandenes lokales Verzeichnis. Leider wird POPDwird nicht mit einem Wert größer 0 beendet, wenn das ursprüngliche aktuelle Verzeichnis nicht wiederhergestellt werden kann, sodass es unmöglich ist, diesen ganz besonderen Fehlerzustand nur mit dem Exit-Code von POPD zu erkennen . Es kann jedoch davon ausgegangen werden, dass niemand jemals auf diesen ganz besonderen Fehlerfall stößt, da UNC-Pfade normalerweise nicht für den Zugriff auf lokale Dateien und Ordner verwendet werden.

Um die verwendeten Befehle noch besser zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie dort die folgenden Befehle aus und lesen Sie die für jeden Befehl angezeigte Hilfe sorgfältig durch.

  • pushd /?
  • popd /?
  • rd /?

Einzelne Linie mit mehreren Befehlen Windows - Batch - Datei erklärt die Operatoren &&und &verwendet hier.


Als nächstes betrachten wir die Batch-Dateilösung mit dem Befehl DEL zum Löschen von Dateien in %PathToFolder%und FOR und RD zum Löschen der Unterordner in %PathToFolder%.

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal

Die Batch-Datei stellt zunächst sicher, dass die Umgebungsvariable PathToFolderwirklich mit einem Ordnerpfad ohne doppelte Anführungszeichen und ohne Backslash am Ende definiert ist. Der Backslash am Ende wäre kein Problem, aber doppelte Anführungszeichen in einem Ordnerpfad könnten problematisch sein, da der Wert von PathToFolderwährend der Ausführung der Batchdatei mit anderen Zeichenfolgen verkettet wird.

Wichtig sind die beiden Zeilen:

del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

Mit dem Befehl DEL werden alle Dateien im angegebenen Verzeichnis gelöscht.

  • Die Option /Aist erforderlich, um wirklich alle Dateien zu verarbeiten, einschließlich Dateien mit dem versteckten Attribut, das DEL ohne Verwendung der Option ignorieren würde /A.
  • Die Option /Fist erforderlich, um das Löschen von Dateien mit dem schreibgeschützten Attributsatz zu erzwingen.
  • Die Option /Qist erforderlich, um mehrere Dateien stillschweigend zu löschen, ohne den Benutzer zu fragen, ob mehrere Dateien wirklich gelöscht werden sollen.
  • >nulist erforderlich, um die Ausgabe der für STDOUT geschriebenen Dateinamen auf das Gerät NUL umzuleiten , das nicht gelöscht werden kann, da gerade eine Datei geöffnet ist oder der Benutzer keine Berechtigung zum Löschen der Datei hat.
  • 2>nulist erforderlich, um die Ausgabe der Fehlermeldung für jede Datei, die nicht vom Handle STDERR gelöscht werden kann, an das Gerät NUL umzuleiten .

Mit den Befehlen FOR und RD werden alle Unterverzeichnisse im angegebenen Verzeichnis entfernt. Wird for /Daber nicht verwendet, da FOR in diesem Fall Unterverzeichnisse mit dem versteckten Attributsatz ignoriert. Aus diesem Grund for /Fwird die folgende Befehlszeile in einem separaten Befehlsprozess ausgeführt, der im Hintergrund mit gestartet wird %ComSpec% /c:

dir "%PathToFolder%\*" /AD /B 2>nul

DIR- Ausgaben im Bare-Format aufgrund /Bder Verzeichniseinträge mit Attribut D, dh der Namen aller Unterverzeichnisse im angegebenen Verzeichnis, unabhängig von anderen Attributen wie dem versteckten Attribut ohne Pfad. 2>nulwird verwendet, um die von DIR ausgegebene Fehlermeldung in einem Verzeichnis, das vom Handle STDERR gefunden wurde, an das Gerät NUL umzuleiten .

Der Umleitungsoperator >muss mit dem Caret-Zeichen ^in der FOR- Befehlszeile maskiert werden, um als Literalzeichen interpretiert zu werden, wenn der Windows-Befehlsinterpreter diese Befehlszeile verarbeitet, bevor der Befehl FOR ausgeführt wird, der die eingebettete dirBefehlszeile in einem separaten Befehlsprozess ausführt im Hintergrund.

FOR verarbeitet die erfasste Ausgabe, die für STDOUT eines gestarteten Befehlsprozesses geschrieben wurde. Dies sind die Namen der Unterverzeichnisse ohne Pfad, die niemals in doppelte Anführungszeichen gesetzt werden.

FOR mit Option /Fignoriert leere Zeilen, die hier nicht vorkommen, da DIR mit Option /Bkeine leeren Zeilen ausgibt.

FOR würde auch Zeilen ignorieren, die mit einem Semikolon beginnen, das das Standardzeichen für das Zeilenende ist. Ein Verzeichnisname kann mit einem Semikolon beginnen. Aus diesem Grund eol=|wird das vertikale Balkenzeichen als Zeilenendezeichen definiert, dessen Name kein Verzeichnis oder keine Datei enthalten darf.

FOR würde die Zeile unter Verwendung von Leerzeichen und horizontaler Tabulator als Trennzeichen in Teilzeichenfolgen aufteilen und der angegebenen Schleifenvariablen nur die erste durch Leerzeichen / Tabulatoren getrennte Zeichenfolge zuweisen I. Dieses Aufteilungsverhalten ist hier nicht erwünscht, da ein Verzeichnisname ein oder mehrere Leerzeichen enthalten kann. Daher delims=wird eine leere Liste von Trennzeichen definiert, um das Verhalten der Zeilenteilung zu deaktivieren und der Schleifenvariablen Iimmer den vollständigen Verzeichnisnamen zuzuweisen .

Der Befehl FOR führt den Befehl RD für jeden Verzeichnisnamen ohne Pfad aus. Aus diesem Grund muss in der RD- Befehlszeile der Ordnerpfad erneut angegeben werden, der mit dem Namen des Unterordners verknüpft ist.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie dort die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?
Mofi
quelle
5

Verwenden Sie den Editor , um ein Textdokument zu erstellen und dieses zu kopieren / einzufügen:

rmdir /s/q "%temp%"
mkdir "%temp%"

Wählen Sie Speichern unter und Dateiname:

delete_temp.bat

Dateityp: Alle Dateien und klicken Sie auf die SaveSchaltfläche.

Es funktioniert auf jeder Art von Konto (Administrator oder Standardbenutzer). Lass es einfach laufen!

In diesem Beispiel verwende ich eine temporäre Variable, aber Sie können jede andere verwenden! PS: Nur für Windows!

Filip Gjorgjevikj
quelle
Eine recht einfache und saubere Lösung
Carlos Liu
4

So löschen Sie eine Datei:

del PATH_TO_FILE

So löschen Sie einen Ordner mit allen darin enthaltenen Dateien:

rmdir /s /q PATH_TO_FOLDER

Das Löschen aller Dateien aus einem bestimmten Ordner (nicht das Löschen des Ordners selbst) ist etwas kompliziert. del /s *.*Ordner können nicht gelöscht werden, entfernt jedoch Dateien aus allen Unterordnern. Es werden also zwei Befehle benötigt:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"
Maxim Suslov
quelle
Ja das ist korrekt. Muss zwei Schritte sein. Dies verdient mehr Gegenstimmen, weil es erklärt, warum im Vergleich zu einer mehr abgestimmten Antwort oben.
WesternGun
In der DEL- Befehlszeile fehlt die Option /A, auch Dateien mit verstecktem Attributsatz /Fzu löschen , und die Option , auch Dateien mit schreibgeschütztem Attributsatz und doppelten Anführungszeichen um das letzte Argument zu löschen. Wäre del /A /F /Q "PATH_TO_FOLDER\*"also besser. Die FOR- Befehlszeile sollte geändert werden, for /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I"da FOR Verzeichnisse mit ausgeblendeten Attributen ignoriert. DIR mit Optionen /AD /Bgibt alle Verzeichnisse PATH_TO_FOLDERnur mit ihren Namen aus.
Mofi
Wie unterscheidet sich dies von (einigen) vorherigen Antworten?
Peter Mortensen
4

Sie können dies tun, indem Sie den folgenden Befehl verwenden, um alle Inhalte und den übergeordneten Ordner selbst zu löschen:

RMDIR [/S] [/Q] [drive:]path            
Ripon Al Wasim
quelle
Wie unterscheidet sich das von den beiden vorherigen Antworten?
Peter Mortensen
Behebt diese Antwort die Anforderung "Möglicherweise liegt ein Fehler wie" Diese Datei / dieser Ordner wird bereits verwendet "vor. In diesem Fall sollte einfach fortgefahren werden und diese Datei / dieser Ordner übersprungen werden." ?
Peter Mortensen
1

Ich habe mehrere dieser Ansätze ausprobiert, aber keiner hat richtig funktioniert.

Ich habe diesen zweistufigen Ansatz auf der Windows-Befehlszeile der Site gefunden :

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

Es funktionierte genau so, wie ich es brauchte und wie es vom OP angegeben wurde.

Paul Haan
quelle
Die beiden Befehlszeilen können zu einer Befehlszeile kombiniert werden: Die Option forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file" DEL/A wird hinzugefügt, um auch Dateien mit ausgeblendeten Attributen zu löschen, da DEL sonst für jede ausgeblendete Datei in eine nicht gefundene Fehlermeldung ausgeben würde %pathtofolder%. Die Option DEL/F wird hinzugefügt, um auch Dateien mit aktiviertem schreibgeschützten Attribut zu löschen, %pathtofolder%da DEL andernfalls eine Fehlermeldung ausgeben würde, dass der Zugriff verweigert wird.
Mofi
Diese Lösung ist die langsamste aller hier veröffentlichten unvollständigen Lösungen, da cmd.exefür jede Datei und jedes Verzeichnis eine Instanz gestartet wird %pathtofolder%. Der Vorteil ist, dass FORFILES Verzeichnisse mit ausgeblendeten Attributen nicht wie FOR ignoriert .
Mofi
Betreff "Es hat genau so funktioniert, wie ich es brauchte und wie es vom OP angegeben wurde." : Haben Sie auf die Anforderung getestet, dass möglicherweise ein Fehler wie "Diese Datei / dieser Ordner wird bereits verwendet" vorliegt. In diesem Fall sollte die Datei / der Ordner einfach fortgesetzt und übersprungen werden. ?
Peter Mortensen
0
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q
Robie
quelle
In der zweiten Zeile werden die Dateien in jeder Datei aus allen Ordnern im Windows-temporären Verzeichnis entfernt, und in der dritten Zeile werden die Verzeichnisse einschließlich ihres Inhalts bereinigt.
Robie
Die FOR- Befehlszeile sollte geändert werden, for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"da FOR Verzeichnisse mit ausgeblendeten Attributen ignoriert. DIR mit Optionen /AD /Bgibt alle Verzeichnisse %TEMP%nur mit ihren Namen aus.
Mofi
Dokumentation für DEL . Ich denke, Sie sind mit / F auf dem richtigen Weg: "Schreibgeschützte Einstellungen ignorieren und trotzdem löschen (FORCE)"
Peter Mortensen
-10

Verwenden:

del %pathtofolder%\*.*   /s /f  /q

Dadurch werden alle Dateien und Unterordner gelöscht %pathtofolder%, einschließlich schreibgeschützter Dateien, und es wird keine Bestätigung angefordert.

Alon
quelle
9
Feind mir, dies lässt leere Unterordner in% pathtofolder%.
DH
35
Unterordner in% pathtofolder% werden NICHT gelöscht. So schlecht, dass ich keinen Ruf habe, diese falsche Antwort
abzustimmen
1
Wie von Vitalii Korsakov hervorgehoben, werden dadurch alle Dateien und Dateien aus den Unterverzeichnissen gelöscht, die Unterverzeichnisse bleiben jedoch an Ort und Stelle, die das OP ebenfalls entfernen soll.
Fuzz Evans
6
Obwohl dieser Befehl leere Ordner hinterlässt, ist er viel näher an der Anforderung als an der akzeptierten Antwort. Dies hängt natürlich von den Umständen ab. In meinem Fall hätte ich lieber leere Ordner als Dateien im Stammverzeichnis.
MarcusUA
Aber wie können wir Ordner und Unterordner löschen, die in der Netzwerkfreigabe geöffnet waren, als ein anderer Clientcomputer das Freigabelaufwerk mit Schreibzugriff auf diesen Ordner öffnete? Der Befehl psfile und net files schließt die Dateisitzung, wird jedoch nach einigen Sekunden erneut erstellt automatisch eine weitere Sitzung für diesen Benutzer im Server ...
user1954762