Ich habe zwei Laufwerke, sagen wir Laufwerk A (F:) und Laufwerk B (G:). Ich habe einmal den gesamten Inhalt von Laufwerk B auf Laufwerk A kopiert. Aber danach wurden Laufwerk B einige neue Dateien und Ordner hinzugefügt. Ich möchte die doppelten Dateien und Ordner von Laufwerk B löschen und nur diejenigen belassen, die auf Laufwerk A nicht vorhanden sind.
Ich habe den folgenden Befehl ausprobiert, um zu prüfen, ob Duplikate gefunden wurden, aber er funktioniert nicht wie gewünscht, da die Variable den vollständigen Pfad enthält %%a
. Natürlich echo %%a
wird die aktuelle Ausgabe durch ein Äquivalent ersetzt, DEL
falls es funktioniert.
@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause
/s
Wenn ich den Schalter aus dem Befehl entferne, dir
funktioniert es, weil %%a
nur der Dateiname statt des vollständigen Pfads angezeigt wird. Es funktioniert jedoch nicht rekursiv für die Unterordner und ist daher nicht so nützlich.
Antwort1
@echo off
for /F "delims=" %%a in ('
dir G:\*.* /b /s /A:-D
') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause
Erläuterung:
/A:-D
um Verzeichnisse (Ordner) aus der Liste auszuschließen, da der nachfolgendedel
Befehl Dateien statt Verzeichnisse löschen würde (gemäßdel /?
: Wenn ein Verzeichnis angegeben ist, werden alle Dateien innerhalb des Verzeichnisses gelöscht, der Ordner selbst wird jedoch nicht entfernt);- Ordner getrennt behandeln: Verwenden Sie einen anderen
for /F
gegendir
mit/A:D
Schalter, aber in diesem Fall verwenden Sierd
anstelle vondel
Befehl zuEinen Ordner löschen; verwenden Sie dies,rd /S
um eine komplette Ordnerstruktur zu entfernen (alle Dateien und Unterordner zusätzlich zum Ordner selbst). %%~pnxa
dehnt sich%%a
voll ausPfad + Name + Erweiterungeinschließlich eines führenden\
(keineG:
Datenträgerangabe);del "%%~a"
Vollständiger Pfad in doppelte Anführungszeichen gesetzt, um Pfade mit Leerzeichen richtig zu behandeln;- Ich empfehle
"delims="
stattdessen,"tokens=*"
mögliche führende Leerzeichen in Dateinamen richtig zu behandeln (dies könnte auch ohne/S
Flag erfolgen); - Berücksichtigen Sie zusätzliche Kommandozeilenschalter (siehe
del /?
undrd /?
).