Kopieren Sie Dateien ohne zu überschreiben

99

Ich kann einfach keine Möglichkeit finden, in der Befehlszeile zu sagen: "Kopieren Sie alle Dateien von Verzeichnis A nach Verzeichnis B, aber wenn die Datei bereits in Verzeichnis B vorhanden ist, überschreiben Sie sie nicht, unabhängig davon, welche Datei neuer ist." und fordere mich nicht auf. "

Ich habe Kopieren, Verschieben, Kopieren und Robokopieren durchlaufen, und das Beste, was ich bekommen kann, ist, dass Sie Robokopieren "Kopie A nach B kopieren, aber neuere Dateien nicht mit älteren Dateien überschreiben" mitteilen können, aber das funktioniert bei mir nicht . Ich habe mir xxcopy angesehen, es aber verworfen, da ich keine Abhängigkeit von Drittanbietern von einem Visual Studio-Post-Build-Ereignis haben möchte, bei dem andere SVN-Benutzer dieses Tool installieren müssen, um den Build durchzuführen.

Ich möchte dem Post-Build-Ereignis in Visual Studio 2010 eine Befehlszeile hinzufügen, damit die Dateien, die aus den T4- Vorlagen für neue EF- Modellobjekte generiert werden, an die Projektordner verteilt werden, zu denen sie gehören, aber Dateien für vorhandene Objekte neu generiert Überschreiben Sie möglicherweise nicht bearbeitete Zieldateien nicht.

Da die T4-Vorlage neu generiert wird, ist die Quelldatei immer neuer und ich kann den "neueren" Schalter nicht zuverlässig verwenden, glaube ich nicht.

Ich verwende Teilklassen für die Elemente, für die ich kann, aber es gibt andere Dinge, die ich generiere, die keine Teilklassen verwenden können (z. B. Generieren einer Standard-EditorTemplate- oder DisplayTemplate * .ascx-Datei).

Hat jemand ähnliche Probleme, die er gelöst hat?

Tony
quelle
Sind Sie vertraut mit cmd.exe‚s - forBefehl? Wenn nicht, empfehle ich Ihnen, das auszuführen for /?und zu verwenden.
Gabe

Antworten:

38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
Stu
quelle
5
Dies funktionierte für mich, aber ich musste zwei Prozentzeichen anstelle von einem verwenden, da ich dies in einer Batchdatei und nicht in der Befehlszeile ausführte. Ich habe Instanzen von% F durch %% F und Instanzen von% ~ nxF durch %% ~ nxF ersetzt.
Owen
1
Was ist ~nxin %~nxFmeinen genau?
Serge Rogatch
@stu heißt es nur, dass aus ~nxFder Variablen Fein Dateiname und eine Erweiterung wird.
Serge Rogatch
Ja, geben Sie mir so effektiv den Dateinamen + die Erweiterung ohne den Pfad. Dies ist erforderlich, um den Test im Zielordner durchzuführen und den Zieldateinamen anzugeben. Der Punkt ist, dass% F den Pfad enthält und Sie ihn dort nicht möchten.
Stu
207

Robocopy , oder „Robust File Copy“, ist ein Befehl Verzeichnisreplikationsbefehlszeile. Es war als Teil des Windows Resource Kit ab Windows NT 4.0 verfügbar und wurde als Standardfunktion von Windows Vista, Windows 7 und Windows Server 2008 eingeführt.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

Zur Ausarbeitung (unter Verwendung der Antworten von Hydrargyrum, HailGallaxar und Andy Schmidt):

  • /E Robocopy kopiert rekursiv Unterverzeichnisse, einschließlich leerer.
  • /XCschließt vorhandene Dateien mit demselben Zeitstempel, aber unterschiedlichen Dateigrößen aus. Robocopy überschreibt diese normalerweise.
  • /XNschließt vorhandene Dateien aus, die neuer als die Kopie im Zielverzeichnis sind. Robocopy überschreibt diese normalerweise.
  • /XOschließt vorhandene Dateien aus, die älter als die Kopie im Zielverzeichnis sind. Robocopy überschreibt diese normalerweise.

Ohne die Klassen "Geändert", "Älter" und "Neuer" macht Robocopy genau das, was das Originalposter will - ohne dass eine Skriptumgebung geladen werden muss.

Referenzen: Technet , Wikipedia
Download von: Microsoft Download Link (Link zuletzt überprüft am 30. März 2016)

Dr. Belisarius
quelle
Mit "ausschließen" meinen Sie "überspringen" oder "löschen / entfernen"?
Luftangriff
@Andre Terra: Normalerweise überspringen. Wenn Sie das Flag / MIR verwenden, werden diese möglicherweise entfernt. Das habe ich nicht getestet.
Hydrargyrum
Mit / MIR werden Dateien, die nicht in der Quelle vorhanden sind, tatsächlich entfernt. Wenn Sie jedoch auch / XN und / XO verwenden, werden Dateien, die an beiden Stellen vorhanden sind, einfach übersprungen (nicht sicher, ob die Größe aktiviert ist). Dies ist ideal für Situationen, in denen ich entweder eine neuere oder eine ältere Version meiner Anwendung kopieren muss, die dateModified-Stempel der von der Anwendung verwendeten Bibliotheken jedoch falsch sind und die Dateinamen selbst ihre Versionsnummer enthalten.
Henno Vermeulen
Ist es notwendig, aufzunehmen /e? Was ist, wenn Sie /sstattdessen verwenden? Ich möchte keine leeren Unterordner.
Arete
48

Die Lösung von Belisarius ist gut.

Um auf diese etwas knappe Antwort einzugehen:

  • /E Robocopy kopiert rekursiv Unterverzeichnisse, einschließlich leerer.
  • /XCschließt vorhandene Dateien mit demselben Zeitstempel, aber unterschiedlichen Dateigrößen aus. Robocopy überschreibt diese normalerweise.
  • /XNschließt vorhandene Dateien aus, die neuer als die Kopie im Quellverzeichnis sind. Robocopy überschreibt diese normalerweise.
  • /XOschließt vorhandene Dateien aus, die älter als die Kopie im Quellverzeichnis sind. Robocopy überschreibt diese normalerweise.

Ohne die Klassen "Geändert", "Älter" und "Neuer" macht Robocopy genau das, was das Originalposter will - ohne dass eine Skriptumgebung geladen werden muss.

Hydrargyrum
quelle
46

Sie können dies versuchen:

echo n | copy /-y <SOURCE> <DESTINATION>

-yVor dem Überschreiben werden einfach Eingabeaufforderungen angezeigt, und wir können alle diese Fragen beantworten. Dies würde also im Wesentlichen nur nicht vorhandene Dateien kopieren. :) :)

sachin11
quelle
2
Schön einfach.
Holf
6
Warum beantwortet es alle Fragen, wenn wir nur einmal pfeifen?
Phuclv
Super, ich habe mich für diese Option entschieden. Bevor ich an Rohrleitungen dachte, googelte ich nach einem Parameter, den ich für vermisst hielt, und stieß dann auf diese Seite. Beim Versuch dieser Lösung ist mir aufgefallen, dass beim Piping beim Kopieren anscheinend der Parameter / Y aktiviert ist. Deshalb muss / -Y hinzugefügt werden.
Andrew
2
@phuclv Es scheint copy /-ynur automatisch anzunehmen, dass Nein, sobald stdin keine Eingabe mehr hat. Sie können die erste explizite weglassen noder < nulin sie einleiten , und das Gleiche passiert.
mwfearnley
6

Hier ist es in Batch-Datei-Form:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
Gabe
quelle
3

Ich möchte nur etwas aus meinen eigenen Tests klären.

@ Hydrargyrum schrieb:

  • / XN schließt vorhandene Dateien aus, die neuer als die Kopie im Quellverzeichnis sind. Robocopy überschreibt diese normalerweise.
  • / XO schließt vorhandene Dateien aus, die älter als die Kopie im Quellverzeichnis sind. Robocopy überschreibt diese normalerweise.

Das ist eigentlich rückwärts. XN bedeutet „Ausschließen Neuere“ Dateien , aber es schließt Dateien , die in dem als die Kopie neuer sind Zielverzeichnis. XO führt "Älteres ausschließen" aus, schließt jedoch Dateien aus, die älter als die Kopie im Ziel sind Zielverzeichnis.

Natürlich machen Sie wie immer Ihre eigenen Tests.

HagelGallaxar
quelle
1
Ist dies eine Antwort auf die ursprüngliche Frage oder ein Kommentar zur Antwort eines anderen?
ASGM
1
Ist die Antwort von Hydrargyrum, die zum Zeitpunkt des Schreibens +25 Stimmen hat, eine Antwort auf die ursprüngliche Frage oder ein Kommentar zur Antwort eines anderen?
mo.
3

Es gibt eine seltsame Möglichkeit, dies mit xcopy zu tun:

echo nnnnnnnnnnn | xcopy /-y source target

Fügen Sie einfach so viele n wie Dateien ein, die Sie kopieren, und es werden n auf alle Fragen zum Überschreiben beantwortet.

Adam sagt - Monica wieder einsetzen
quelle
In Bezug auf copysehen, diese Antwort , speziell @mwfearnley Kommentar: copy /-yautomatisch übernimmt , nwenn stdin erschöpft ist, so dass Sie zB können echo nnur einmal und es funktioniert immer noch.
Rsenna
3
robocopy src dst /MIR /XX

/ XX: eXclude "eXtra" -Dateien und -Verzeichnisse (im Ziel vorhanden, aber nicht in der Quelle). Dadurch werden Löschungen vom Ziel verhindert. (Dies ist die Standardeinstellung)

be_good_do_good
quelle
1

Robocopy kann hier für Systeme heruntergeladen werden, auf denen es noch nicht installiert ist. (Dh Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=de&id=17657 (für die Installation ist kein Neustart erforderlich)

Denken Sie daran, Ihren Weg zur Robocopy-Exe festzulegen. Klicken Sie dazu mit der rechten Maustaste auf "Arbeitsplatz"> Eigenschaften> Erweitert> "Umgebungsvariablen", suchen Sie die Pfadsystemvariable und fügen Sie diese am Ende hinzu: "; C: \ Programme \ Windows Resource Kits \ Tools" oder wo immer Sie möchten installiert es. Stellen Sie sicher, dass Sie die bereits vorhandenen Pfadvariablenzeichenfolgen belassen, und fügen Sie einfach den zusätzlichen Pfad hinzu.

Sobald der Pfad festgelegt ist, können Sie den von belisarius vorgeschlagenen Befehl ausführen. Es funktioniert großartig.

Greg
quelle
1

Ich kann die falschen Nachrichten nicht direkt kommentieren, sondern nur alle warnen, dass die Definition der Optionen / XN und / XO im Vergleich zu den in vorherigen Nachrichten veröffentlichten Definitionen umgekehrt ist.

Die Option "Ältere / neuere Dateien ausschließen" stimmt mit den Informationen überein, die in der RoboCopy-Protokollierung angezeigt werden: RoboCopy durchläuft die QUELLE und meldet dann, ob jede Datei in der QUELLE "ÄLTER" oder "NEUER" als die Datei im Ziel ist.

Folglich schließt / XO OLDER SOURCE-Dateien aus (was intuitiv ist), die nicht "älter als die Quelle" sind, wie hier behauptet wurde.

Wenn Sie nur neue oder geänderte Quelldateien kopieren möchten, aber nicht neuere Zieldateien ersetzen möchten, ist / XO die richtige Option.

Andy Schmidt
quelle
0

Ein einfacher Ansatz wäre die Verwendung der Option / MIR, um die beiden Verzeichnisse zu spiegeln. Grundsätzlich werden nur die neuen Dateien zum Ziel kopiert. Im nächsten Befehl ersetzen Sie Quelle und Ziel durch die Pfade zu Ihren Ordnern. Das Skript sucht nach Dateien mit beliebigen Erweiterungen.

robocopy <source directory> <destination directory> *.* /MIR
Ionut V.
quelle
0

Das hat bei mir funktioniert. Ich benutze dies, um Dateien zum anderen Laufwerk hinzuzufügen, ohne sie zu überschreiben.

Batch-Datei: robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

Beispiel:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

Testen Sie vor der Implementierung.

Ramesh
quelle