Löschen Sie den Inhalt von Ordnern mit gleichem Namen in verschiedenen Unterverzeichnissen

Löschen Sie den Inhalt von Ordnern mit gleichem Namen in verschiedenen Unterverzeichnissen

Ich verwende Windows 10.

Ich habe viele gleichnamige Ordner (nehmen wir an, der Name ist „data“) in verschiedenen Unterverzeichnissen eines Basisverzeichnisses (hier „d:\dir“).

Wie kann ich den Inhalt (der nur Dateien enthält) aller Ordner mit dem Namen „Daten“ löschen, ohne sich selbst zu löschen?

Beispiel für drei Ordner:

d:\dir\data
d:\dir\tmp1\data
d:\dir\tmp3\tmp2\data

Antwort1

In einem Windows-Eingabeaufforderungsfenster können Sie mit der folgenden Befehlszeile alle Dateien (keine Ordner) in allen dataVerzeichnissen D:\dirund deren Unterverzeichnissen löschen:

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

Die gleiche Befehlszeile würde in einer Windows-Batchdatei wie folgt geschrieben werden:

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

Der BefehlFÜRwird in einem separaten Befehlsprozess ausgeführt, der mit %ComSpec% /Cder Befehlszeile im Hintergrund gestartet wird:

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

Die Umgebungsvariable wird normalerweise wie folgt ComSpecdefiniert:%SystemRoot%\System32\cmd.exeSystemUmgebungsvariablen in WindowsSystemsteuerung – System – Erweiterte Systemeinstellungen – Umgebungsvariablen …. Die Umgebungsvariable SystemRootwird standardmäßig mit dem Pfad zum Windows-Verzeichnis definiert. Mit anderen WortenFÜRwird standardmäßig auf den meisten Windows-PCs C:\Windows\System32.exemit Option und der zwischen und /Cangegebenen Befehlszeile ausgeführt . Siehe auch Wikipedia-Artikel mit einer Liste vordefinierter('')Windows-Umgebungsvariablen.

Der BefehlDIRAusgänge zu handhabenSTDOUT(Standardausgabe)

  • im nackten Format aufgrund der Option/B
  • nur Verzeichnisnamen aufgrund der Option /AD(Attributverzeichnis)
  • mit vollständigem Pfad wegen Option/S
  • Übereinstimmung mit dem Platzhaltermuster*data
  • im angegebenen VerzeichnisD:\dir
  • und alle seine Unterverzeichnisse auch wegen der Option /S.

DIRwürde eine Fehlermeldung ausgeben, die zu behandeln istSTDERR(Standardfehler) bei keinem Verzeichniseintrag, der diesen Kriterien entspricht. Diese Fehlermeldung wird unterdrückt, indem sie auf das Gerät umgeleitet wirdNULmit 2>nul.

Die Ausgabe vonDIRist für das gegebene Beispiel:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

Die Ausgabe vonDIRzu handhabenSTDOUTwird umgeleitet mit |zu behandelnSTDIN(Standardeingabe) des nächsten BefehlsFINDSTR.

FINDSTRSuchvorgänge im Datenstrom lesen vonSTDINZeile für Zeile

  • Groß-/Kleinschreibung wird aufgrund der Option nicht berücksichtigt/I
  • die wörtlich interpretierte Zeichenfolge\data
  • die aufgrund der Option am Ende einer Zeile stehen muss /E.

AlsoFINDSTRAusgänge zu handhabenSTDOUTdes Hintergrundkommandos verarbeitet alle Zeilen mit \dataat end of line, was für das gegebene Beispiel noch einmal ist:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

Filtern der BefehlsausgabeDIRmitFINDSTRist notwendig, um ein Verzeichnis mit einem Namen wie auszuschließen, MyDatader auch ausgegeben wird vonDIRwegen des Platzhalters , der erforderlich ist, um nicht alle Unterverzeichnisse von und dessen Unterverzeichnisse *auszugeben , sondern alle Verzeichnisse in und dessen Unterverzeichnisse.D:\dir\datadataD:\dir

Lesen Sie den Microsoft-Artikel überVerwenden von Befehlsumleitungsoperatorenfür eine Erklärung von 2>nulund |. Die Umleitungsoperatoren >und |müssen mit einem Zirkumflexzeichen maskiert werden ^.FÜRBefehlszeile, die als Literalzeichen interpretiert wird, wenn der Windows-Befehlsinterpreter diese Befehlszeile verarbeitet, bevor der Befehl ausgeführt wirdFÜRwelches die eingebettete dirBefehlszeile in einem separaten, im Hintergrund gestarteten Befehlsprozess ausführt.

FÜRmit Option /Ferfasst alles, was ausgegeben wird, schließlich zu verarbeitenSTDOUTdes gestarteten Kommandoprozesses und verarbeitet diese Ausgabe nach Beendigung von gestartet zeilenweise cmd.exe.

Leere Zeilen werden immer ignoriert vonFÜR, aber es werden keine leeren Zeilen ausgegeben vonDIRUndFINDSTR.

FÜRignoriert standardmäßig auch alle Zeilen, die mit einem beginnen, ;was das Standard-Zeilenendezeichen ist. Aber alle Zeilen, die vonFÜRBeginnen Sie in diesem Fall nie mit einem Semikolon, da alle Zeilen mit beginnen . Daher kann D:die Standardeinstellung beibehalten werden. Andernfalls ist es normalerweise am besten, eine Liste mit Datei-/Ordnernamen zu verarbeiten, da kein Datei-/Ordnername den vertikalen Strich enthalten kann.eol=;eol=|

FÜRwürde standardmäßig jede Zeile in Teilzeichenfolgen aufteilen, wobei normale Leerzeichen und horizontale Tabulatorzeichen als Zeichenfolgentrennzeichen verwendet werden, und würde nur die erste durch Leerzeichen/Tabulatorzeichen getrennte Zeichenfolge der angegebenen Schleifenvariable zuweisen I. Ein Ordnername im Pfad eines dataVerzeichnisses könnte ein Leerzeichen enthalten. Aus diesem Grund wird eine leere Liste von Trennzeichen angegeben, mit delims=der das Zeilenaufteilungsverhalten deaktiviert wird, was dazu führt, dass der Schleifenvariable Iimmer der vollständige Name eines gefundenen dataOrdners zugewiesen wird.

FÜRwird für jedes dem Befehl datazugewiesene Verzeichnis ausgeführt I:

del /A /F /Q "%I\*"

%Iwird ersetzt vor der Ausführung vonDELdurch den vollständig qualifizierten Verzeichnisnamen, der aktuell der Loop-Variable zugewiesen ist I.

Der BefehlDELdient zum Löschen von Dateien. Verzeichnisse werden nicht gelöscht. Die Option /Awird verwendet, um alle Dateien unabhängig von ihren Attributen zu löschen, einschließlich Dateien mit versteckten Attributen, dieDELwürde ohne Option nicht gelöscht werden /A. Die Option /Fwird benötigt, um auch das Löschen einer Datei mit gesetztem Nur-Lese-Attribut zu erzwingen, die ohne Option nicht gelöscht würde /F. Die Option /Qwird verwendet, um die Abfrage des Benutzers zu unterdrücken, ob wirklich alle Dateien, die mit übereinstimmen, *mit gelöscht werden sollenDEL.

Der vollständige Verzeichnisname muss in Anführungszeichen eingeschlossen werden, da er ein Leerzeichen oder eines dieser Zeichen enthalten könnte, &()[]{}^=;!'+,`~was die Verwendung von "um eine Argumentzeichenfolge eines Befehls erfordert, wie anhand von erklärt wirdCMD auf der letzten Hilfeseite, die beim Ausführen in einem Eingabeaufforderungsfenster ausgegeben wird cmd /?.

Bitte beachte, dassDELkann keine Dateien löschen, für die der Benutzer keine NTFS-Berechtigung zum Löschen von Dateien hat oder die aktuell von einer Anwendung auf eine Weise geöffnet werden, die das Löschen der Datei während des Öffnens durch die Anwendung verhindert.DELgibt für jede Datei, die aufgrund fehlender NTFS- oder Dateizugriffsberechtigungen nicht gelöscht werden kann, eine Fehlermeldung aus.

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 für jeden Befehl angezeigten Hilfeseiten sehr sorgfältig durch.

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?

Antwort2

In Ihrem Beispiel müssten Sie aufrufen:

Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item

Antwort3

Alle Ordner mit dem Namen „data“ rekursiv auflisten und anschließend deren Inhalt löschen.

$base_dir = 'D:\dir'
$name     = 'data'

Get-ChildItem $base_dir -Recurse -Force | Where-Object {
    $_.PSIsContainer -and
    $_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
    Remove-Item "$_\*" -Recurse -Force
}

In PowerShell v3 und höher können Sie die Filterbedingung $_.PSIsContainerdurch Verwendung des Parameters -Directorydurch ersetzen Get-ChildItem.

verwandte Informationen