Verwenden von Platzhaltern mit dem Befehl rmdir oder rd

40

Angenommen, das D:Laufwerk enthält einen Ordner :

D:\Air
D:\Abonden
D:\All
D:\Whatever

Ich möchte alle Ordner löschen, die mit "A" beginnen (einschließlich aller Unterordner und Dateien). Ich habe diesen Befehl ausprobiert:

rmdir D:\A* /s /q

Ich erhalte jedoch eine Fehlermeldung :(

Der Dateiname, der Verzeichnisname oder die Datenträgerbezeichnungssyntax sind falsch.

Der delBefehl funktioniert mit *, aber ich muss auch Ordner löschen.
Gibt es eine Möglichkeit, dies über den rmdirBefehl zu erreichen ?

serdar
quelle
2
Einheitlichkeit und gesunder Menschenverstand spielten bei der Entwicklung der Windows- oder DOS-Befehlsshells nie eine Rolle. Der traurige Teil ist, dass es Modellsysteme gab, als diese Schalen entwickelt wurden, die Licht auf intelligente Designs geworfen hätten. Natürlich ist die Hülle nur ein Beispiel für den schrecklichen bis nicht existierenden Gedankenprozess, der dazu geführt hat, diesen Müll zusammenzuschlagen - ich wünschte, ich könnte Ihnen sagen, was ich wirklich denke, ha ha.
Rick O'Shea

Antworten:

33
cd c:\temp
for /f %i in ('dir /a:d /s /b A*') do rd /s /q %i

Verwenden Sie dies, um Folgendes zu testen:

for /f %i in ('dir /a:d /s /b A*') do echo rd /s /q %i

Dadurch werden die auszuführenden Befehle an die Eingabeaufforderung weitergeleitet, und Sie können sehen, was los ist.

Bedenken Sie, dass dies auch Unterordner wie "C: \ temp \ jjj \ aaa" durchsucht und den aaa-Ordner löscht. Wenn Sie möchten, dass nur die Ordner der obersten Ebene "C: \ temp \ aaa" angezeigt werden, entfernen Sie die "/s"aus dem Befehl.

Der Schlüssel dazu ist das A *, in das Sie den Suchbegriff eingeben würden. Dies wird akzeptiert Platzhalter wie aaa*, aaa*und *aaa*wenn Sie es wollen.

Fazer87
quelle
Der Befehl wird abgebrochen, wenn der Pfad- / Ordnername Leerzeichen enthält.
And31415
1
Können wir für A * "IF NOT EXIST goto EFO" hinzufügen?
Serdar
3
Dies funktioniert, wenn der Pfad Leerzeichen enthält: für / f "delims ="% i in ('dir / a: d / s / b A *') do rd / s / q "% i"
Luis Cantero - MSFT
5
Ich möchte nur hinzufügen, dass, wenn Sie dies aus einer Batch-Datei ausführen, Sie zwei Prozentzeichen verwenden müssen, damit der Befehlfor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen
Keine Notwendigkeit, das Flag 'w / sub' zweimal zu verwenden :)
Lunicon
25

Ordner mit Platzhaltern löschen

Der Befehl rmdir/ rdallein unterstützt keine Platzhalterzeichen (d. H. *Und ?). Sie können diese Einschränkung umgehen, indem Sie sie in eine forSchleife einschließen.

Anwendungsbeispiel

for /d %G in ("X:\A*") do rd /s /q "%~G"

Hinweis Wenn Sie Dateien und Ordner löschen, möchten Sie möglicherweise zuerst den rdBefehl durch ersetzen echo. Auf diese Weise können Sie sicherstellen, dass alles, was nicht gelöscht werden sollte, tatsächlich gelöscht würde.

Mehrere Muster

Um mehrere Ordner mit unterschiedlichen Mustern zu löschen, ist die Syntax nicht zu unterschiedlich. Wie @dbenham richtig hervorhob, reicht ein einzeiliger Befehl aus. Sie können auch verschiedene Pfade angeben:

for /d %G in ("X:\A*","Y:\Whatever\B*","Z:\C?D") do rd /s /q "%~G"

Bonus - Überprüfung der Ordner Existenz

Wenn Sie überprüfen möchten, ob bestimmte Ordner vorhanden sind, können Sie den folgenden Befehl verwenden:

dir /b /a:d "X:\A*" >nul 2>&1 && echo Folders exist. || echo No folders found.

Weitere Lektüre

und31415
quelle
Können wir für A * "IF NOT EXIST goto EFO" hinzufügen?
Serdar
Zum Beispiel nehmen wir an, dass es keinen Ordner gibt, der mit einem Buchstaben beginnt. Der Befehl muss also für B * gehen. Ich weiß nicht, ob ich es erklären könnte oder nicht :(
serdar
1
+1 von mir. Ich verstehe die Abwahl nicht. Sie können jedoch mit Ihren einfachen Befehlen FOR /Dund FOR /D /RBefehlen mehrere Muster erstellen. Einfach benutzen in( "A*" "B*" "C?D" ).
Dbenham
1
Tatsächlich benötigen Sie die /ROption, da sich der Unterordner, der der Maske entspricht, möglicherweise unter einem übergeordneten Ordner befindet, der dies nicht tut.
Dbenham
5
WARNUNG: Wenn Sie diese Lösung in einer .bat-Datei verwenden möchten, müssen Sie %% G anstelle von% G verwenden, siehe hier
ValarDohaeris
18

Wie hat noch niemand dem OP von Forfiles erzählt ?!

forfiles /P D:\ /M A* /C "cmd /c if @isdir==TRUE rmdir /s /q @file"

/ P ist der Pfadname - hier beginnt die Suche
/ M ist eine Suchmaske, die nach Dateien sucht, die mit A beginnen
/ C ist der auszuführende Befehl
/ S ist ein rekursiver Unterordner (hier nicht eingeschlossen, weil op nicht gefragt hat)
JJS
quelle
2
Dies ist eine ausgezeichnete Antwort, sollte die akzeptierte sein.
eacousineau
1
Sehr gute Lösung und gut erklärt.
Andreas
Nützliche Antwort: D, aber IMO for /dwie in and31415 ist sowohl sauberer als auch effizienter.
Superole
12

Die Antwort adn31415 ist korrekt, bricht jedoch ab, wenn Sie sie in ein Batch- oder Cmd-Skript einfügen. Ich schlug stundenlang mit dem Kopf, bis ich herausfand, wie du es benutzt.

Im DOS-Befehlsfenster:

for /d %G in ("X:\A*") do rd /s /q "%~G"

In Batch- oder Cmd-Skript:

for /d %%G in ("X:\A*") do rd /s /q "%%~G"

Wenn Sie es in eine ".bat" - oder eine ".cmd" -Datei einfügen möchten, müssen Sie die "%" -Zeichen verdoppeln.

Sam B
quelle
3
Sie haben meine Zeit für das Batch-Skript gespart!
Tuan
no problem dude :) Deshalb habe ich die Antwort gepostet, da ich wusste, dass es nicht offensichtlich war und mehr Leute darauf stoßen werden.
Sam B
Können wir einen Ausschluss hinzufügen, der nicht gelöscht werden soll?
serdar
SET / P PC = EINGABE IP ODER HOSTNAME für / d %% a in ("\\% PC% \ D $ \ A *. *") ?
serdar