Ich habe 2 Ordner mit Dateien. Diese Dateien sind das Produkt eines Erstellungsprozesses. Der erste Ordner ist die Ausgabe des vorherigen Builds, während der letztere die Ausgabe des aktuellen Builds ist .
Ich möchte diese beiden Ordner irgendwie von der Befehlszeile / dem Build-Skript unterscheiden und nur Dateien, die hinzugefügt wurden, oder Dateien, die neu sind, in einen anderen Ordner kopieren .
Zum Beispiel:
**FOLDER1** (new build)
a.txt
b.txt (modified)
c.txt
d.txt
**FOLDER2** (prev build)
a.txt
b.txt
c.txt
Basierend darauf kopiert der Kopiervorgang, an dem ich interessiert bin, nur b.txt und d.txt in einen anderen Ordner (nicht in Ordner2).
Grundsätzlich bin ich erst nach den "Deltas" und möchte diese irgendwo aufbewahren.
Ist dies mit Standard-Befehlszeilentools möglich, die mit Windows geliefert werden? (Angenommen, Windows 7 / Server 2008 oder höher)
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
Antworten:
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.
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.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.
quelle
Ich mag stattdessen ROBOCOPY. XCOPY wurde jahrelang verwendet und stellte dann fest, dass ein neu startbarer Kopiervorgang über eine langsame / zuckende Internetverbindung erforderlich ist.
ROBOCOPY src dest / s / e / xo
oder Spiegel
ROBOCOPY src dest / mir
Verwenden Sie die Protokollierungsoptionen, um Ihre Liste später zur Prüfung zu erhalten.
ROBOCOPY src dest / s / e / xo / log: Datei
quelle