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 data
Verzeichnissen D:\dir
und 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% /C
der 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 ComSpec
definiert:%SystemRoot%\System32\cmd.exe
SystemUmgebungsvariablen in WindowsSystemsteuerung – System – Erweiterte Systemeinstellungen – Umgebungsvariablen …. Die Umgebungsvariable SystemRoot
wird standardmäßig mit dem Pfad zum Windows-Verzeichnis definiert. Mit anderen WortenFÜRwird standardmäßig auf den meisten Windows-PCs C:\Windows\System32.exe
mit Option und der zwischen und /C
angegebenen 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 Verzeichnis
D:\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 \data
at 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, MyData
der 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\data
data
D:\dir
Lesen Sie den Microsoft-Artikel überVerwenden von Befehlsumleitungsoperatorenfür eine Erklärung von 2>nul
und |
. 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 dir
Befehlszeile in einem separaten, im Hintergrund gestarteten Befehlsprozess ausführt.
FÜRmit Option /F
erfasst 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 data
Verzeichnisses 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 I
immer der vollständige Name eines gefundenen data
Ordners zugewiesen wird.
FÜRwird für jedes dem Befehl data
zugewiesene Verzeichnis ausgeführt I
:
del /A /F /Q "%I\*"
%I
wird 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 /A
wird 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 /F
wird 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 /Q
wird 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 $_.PSIsContainer
durch Verwendung des Parameters -Directory
durch ersetzen Get-ChildItem
.