Copier des fichiers sans écraser

Je n'arrive tout simplement pas à trouver un moyen sur la ligne de commande de dire " copier tous les fichiers du répertoire A au répertoire B, mais si le fichier existe déjà dans le répertoire B, ne l'écrasez pas, peu importe quel fichier est plus récent, et ne m'invite pas."

J'ai traversé copy, move, xcopy & robocopy , et le plus proche que je puisse obtenir est que vous pouvez dire à robocopy "copier A à B, mais ne pas écraser les fichiers plus récents avec des fichiers plus anciens", mais cela ne fonctionne pas pour moi. J'ai regardé xxcopy, mais je l'ai jeté, car je vous ne voulez pas avoir de dépendance tierce sur un événement post-build Visual Studio qui nécessitera l'installation de cet outil par d'autres utilisateurs SVN pour effectuer la construction.

Je souhaite ajouter une ligne de commande à L'événement post-build dans Visual Studio 2010 afin que les fichiers générés à partir des modèlesT4 pour les nouveaux objetsEF soient distribués dans les dossiers de projet auxquels ils appartiennent, mais les fichiers régénérés pour les objets existants n'écrasent pas potentiellement édités fichiers de destination.

Puisque le modèle T4 se régénère, le fichier source est toujours plus récent, et je ne peux pas utiliser le commutateur "plus récent" de manière fiable, Je ne pense pas.

J'utilise des classes partielles pour les éléments pour lesquels je peux, mais il y a d'autres choses que je génère qui ne peuvent pas utiliser des classes partielles (par exemple, générer un EditorTemplate par défaut ou DisplayTemplate *.fichier ascx).

Quelqu'un a des problèmes similaires qu'ils ont résolus?

78
demandé sur Peter Mortensen 0000-00-00 00:00:00

12 réponses

For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
31
répondu Stu 2012-09-01 19:43:49

Robocopy, ou "copie de fichier robuste", est une commande de réplication de répertoire en ligne de commande. Il a été disponible dans le cadre du kit de ressources Windows à partir de Windows NT 4.0, et a été introduit comme une fonctionnalité standard de Windows Vista, Windows 7 et Windows Server 2008.

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

Pour élaborer (en utilisant Hydrargyrum, hailgallaxar et Andy Schmidt réponses):

  • /E permet à Robocopy de copier récursivement les sous-répertoires, y compris ceux qui sont vides.
  • /XC exclut les fichiers existants avec le même horodatage, mais différent les tailles de fichier. Robocopy écrase normalement ceux-ci.
  • /XN exclut les fichiers existants plus récents que la copie dans la destination répertoire. Robocopy normalement remplace ceux-ci.
  • /XO exclut fichiers existants plus anciens que la copie dans la destination répertoire. Robocopy normalement remplace ceux-ci.

Avec les classes Changed, Older et Newer exclues, Robocopy fait exactement ce que le affiche originale veut-sans avoir besoin de charger un environnement de script.

Références: Technet, Wikipédia
Télécharger depuis: lien de téléchargement Microsoft (lien dernière vérification Le Mar 30, 2016)

163
répondu Dr. belisarius 2017-02-02 21:39:05

La solution de Bélisaire est bonne.

Pour développer cette réponse légèrement laconique:

  • /E permet à Robocopy de copier récursivement les sous-répertoires, y compris ceux qui sont vides.
  • /XC exclut les fichiers existants avec le même horodatage, mais différent les tailles de fichier. Robocopy écrase normalement ceux-ci.
  • /XN exclut les fichiers existants plus récents que la copie dans la source répertoire. Robocopy normalement remplace ceux-ci.
  • /XO exclut fichiers existants plus anciens que l' copier dans la source répertoire. Robocopy normalement remplace ceux-ci.

Avec les classes Changed, Older et Newer exclues, Robocopy fait exactement ce que l'affiche originale veut-sans avoir besoin de charger un environnement de script.

42
répondu Hydrargyrum 2012-06-11 08:19:12

Vous pouvez essayer ceci:

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

-y Il suffit d'invites avant d'écraser et nous pouvons diriger n vers toutes ces questions. Donc, cela ne ferait que copier des fichiers non existants. :)

35
répondu sachin11 2015-11-02 02:23:49

Ici, il est sous forme de fichier batch:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
5
répondu Gabe 2010-11-19 21:12:53

Il y a une façon étrange de le faire avec xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Incluez simplement autant de n que les fichiers que vous copiez, et il répondra à n à toutes les questions d'écrasement.

3
répondu Adam Ruth 2015-11-02 19:35:01

Je veux juste clarifier quelque chose de mes propres tests.

@ Hydrargyrum a écrit:

  • / XN exclut les fichiers existants plus récents que la copie dans le répertoire source. Robocopy écrase normalement ceux-ci.
  • / XO exclut les fichiers existants plus anciens que la copie dans le répertoire source. Robocopy écrase normalement ceux-ci.

C'est en fait en arrière. XN "exclut les fichiers plus récents" mais exclut les fichiers plus récents que la copie dans la destination répertoire. XO "exclut les anciens", mais exclut les fichiers plus anciens que la copie dans le répertoire destination .

Bien sûr, faites vos propres tests comme toujours.

2
répondu HailGallaxar 2013-04-16 13:07:03
robocopy src dst /MIR /XX

/ XX: exclut les fichiers et dirs" eXtra " (présents dans la destination mais pas dans la source). Cela empêchera toute suppression de la destination. (c'est la valeur par défaut)

2
répondu be_good_do_good 2017-02-12 16:13:00

Robocopy peut être téléchargé ici pour les systèmes où il n'est pas déjà installé. (I. e. Windows Server 2003.)

Http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (aucun redémarrage requis pour l'installation)

N'oubliez pas de définir votre chemin d'accès à l'exe robocopy. Pour ce faire, cliquez avec le bouton droit sur "Poste de travail" > Propriétés>Avancé> "Variables D'Environnement", puis recherchez la variable système path et ajoutez ceci à la fin:"; C:\Program fichiers \ ressource Windows Kits \ Tools " ou partout où vous l'avez installé. Assurez-vous de laisser les chaînes de variables path qui sont déjà là et ajoutez simplement le chemin d'ajout.

Une fois le chemin défini, vous pouvez exécuter la commande suggérée par belisarius. Il fonctionne très bien.

1
répondu Greg 2012-04-09 15:37:46

Il ne me laissera pas commenter directement les messages incorrects - mais laissez - moi juste avertir tout le monde, que la définition des options /XN et /XO sont inversées par rapport à ce qui a été posté dans les messages précédents.

L'option Exclure les fichiers plus anciens/Plus récents est cohérente avec les informations affichées dans la journalisation de RoboCopy: RoboCopy parcourra la SOURCE et indiquera ensuite si chaque fichier de la SOURCE est "plus ancien" ou "plus récent" que le fichier dans le destination.

Par conséquent, /XO exclura les fichiers sources plus anciens (ce qui est intuitif), Pas "plus anciens que la source" comme cela a été affirmé ici.

Si vous souhaitez copier uniquement des fichiers source nouveaux ou modifiés, mais éviter de remplacer des fichiers de destination plus récents, alors /XO est l'option correcte à utiliser.

1
répondu Andy Schmidt 2016-05-08 16:49:23

Une Approche simple serait d'utiliser l'option / MIR, pour refléter les deux répertoires. Fondamentalement, il ne copiera que les nouveaux fichiers à destination. Dans la prochaine commande, remplacez la source et la destination par les chemins d'accès à vos dossiers, le script recherchera n'importe quel fichier avec n'importe quelle extension.

robocopy <source directory> <destination directory> *.* /MIR
0
répondu Ionut V. 2016-06-17 10:25:57

C'est ce qui a fonctionné pour moi. Je l'utilise pour "ajouter" des fichiers sur l'autre lecteur, sans écrase.

Fichier de commandes: robocopy-missingfiles.MTD

@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"

Exemple:

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

Faites le test avant la mise en œuvre.

0
répondu Ramesh 2016-12-14 03:07:46