Verwenden Sie XCOPY mit den Optionen / D und / L und "kopieren" Sie von Ordner 1 nach Ordner 2.
Die Option / D beschränkt die Kopie nur auf neue oder geänderte Dateien.
Die Option / L bewirkt, dass der Befehl die Dateien auflistet, die kopiert werden sollen, verhindert jedoch, dass tatsächlich Kopien erstellt werden.
Verwenden Sie dann FOR / F, um diese Ergebnisse zu verarbeiten und die Dateien tatsächlich in Ordner 3 zu kopieren.
for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul
Wenn es in eine Batch-Datei eingefügt wird, %
müssen alle als verdoppelt werden %%
.
Das XCOPY druckt auch eine Zusammenfassung aus, wie viele Dateien betroffen sind (wären). Das obige versucht, eine Datei mit der Zusammenfassung "Name" zu kopieren, und schlägt natürlich fehl. Die Umleitung der Ausgabe zu nul verhindert, dass die Fehlermeldung angezeigt wird. Ich habe unter Windows 7 getestet und war überrascht, dass die Fehlermeldung auf stdout und nicht auf stderr war. Wenn die Fehlermeldung in anderen Versionen auf stderr angezeigt wird, sollte der Befehl auch 2> nul erhalten, um die Fehlermeldung zu verhindern.
Es besteht jedoch die Gefahr, dass die Fehlermeldungen ausgeblendet werden. Was passiert, wenn eine Kopie aus irgendeinem Grund fehlschlägt?
Hier ist ein Skript, das alle Dateien auflistet, die erfolgreich kopiert wurden, und angibt, welche (falls vorhanden) fehlgeschlagen sind. Es verwendet FINDSTR, um die unerwünschte Anzahl von Dateien herauszufiltern. Es wird davon ausgegangen, dass die Anzahl der Dateien in Englisch mit dem Formular vorliegt NNN File(s)
, sodass sie für andere Sprachen geändert werden müssten.
@echo off
for /f "eol=: delims=" %%F in (
'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"
Hier ist eine komplexere Variante, die mit jeder Sprache funktioniert. Es speichert jeden Dateinamen in einer Variablen und verzögert die Kopie bis zur nächsten Schleifeniteration. Der letzte Eintrag (die Anzahl) wird nie kopiert.
@echo off
setlocal disableDelayedExpansion
set "file="
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
if defined file (
setlocal enableDelayedExpansion
copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"
endlocal
)
set "file=%%F"
)
xcopy
mit gesetztem Datumsflag. Wenn b in F1 neuer als der neue Ordner ist, wird es kopiert, und wenn b in F2 neuer als in F1 ist, wird es auch kopiert. Bei großen Dateigrößen verschlechtert es sich also schnell (daher die Nichtantwort). Es kann sich lohnen , die Erforschung und eine gewisse Logik für ein tun.bat
mitxcopy /c/h/e/v/y/d