Doppelte Dateien löschen mit der Windows-Kommandozeile
Gegeben, zwei Verzeichnisse c:\foo und c:\bar ich will die Dateien löschen, die in c:\bar identisch sind Dateien, die in c:\foo. Ich kann mit dem fc-Befehl zu vergleichen, jede Datei in c:\bar eine Datei mit dem gleichen Namen in c:\foo und löschen, Duplikate manuell. Gibt es eine einfache Möglichkeit, dies zu automatisieren mit CMD?
- Der einfache Weg, dies zu tun mit einer batch-Datei ist ein Powershell-Skript schreiben und es aufrufen einer batch-Datei.
- Meinst du
batch file
odercommand line
? - Eine batch-Datei oder ein one-liner, kann ich aus der Kommandozeile sind beide in Ordnung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn zwei Dateien können jedoch ein anderes änderungsdatum aufweist aber gleich sein, entfernen Sie die
%%~T..
Teile im Vergleich.echo hello>c:\bar\diff&echo world>c:\foo\diff
Ihr Skript löscht anscheinend verschiedenen - Dateien wahrscheinlich (false positive intrue
Branche: verschiedene Inhalte obwohl die Zeit und das Datum und die Größe die selbe ist). Und mitecho hello>c:\bar\noex&del c:\foo\noex
(false positive inelse
Branche: errorlevel 2)else
Zweig! Mea culpa!Wenn identisch bedeutet ähnlich oder gleichermaßen in jeder Weg: in jeder Weise, nicht nur in Datum und Größe daher gezwungen binäre Vergleich:
Kommentierte entscheidende Punkte in dem obigen Skript:
pushd ...
wechselt das aktuelle Arbeitsverzeichnisfor /F ...
Schleife behandelt statische Datei Liste der Bar Ordnercall :proFC ...
mit richtig zitiert line arguments-Parameterpopd
wechselt das aktuelle Arbeitsverzeichnis zurückgoto :eof
endet das Skript:raiseerror
Unterprogramm gibt exit-code überexit /B %1
:proFC
produktive Unterprogrammcall :raiseerror 321
wichtig als Für ein invalid-switch (mit zwei bestanden-Dateien), wird eine Fehlermeldung ausgedruckt, aber dieerrorlevel
wird nicht geändertfc /B "%~1" "%~2" >NUL 2>&1
Ausgabe-und Fehlermeldungen Weiterleitung zuNUL
als der errorlevel ist wichtig;if %errorlevel% EQU 0 (
echo del "%~1"
eine Datei löschen, nur _echo_ed für debugging-Zwecke) else (
echo %errorlevel% "%~2"
für debugging-Zwecke (siehe unten).goto :eof
kehrt aus der subroutineFC
setzen wird, eineErrorLevel
wie folgt (siehe aber einen Hinweis auf diecall :raiseerror 321
Punkt):