windows - sous - un fichier du même nom existe déjà à cet emplacement




Copie de fichiers sans écrasement (8)

Je n'arrive pas à trouver un chemin sur la ligne de commande pour dire "copier tous les fichiers du répertoire A vers le répertoire B, mais si le fichier existe déjà dans le répertoire B, ne pas l'écraser, quel que soit le fichier le plus récent et ne m'inspire pas. "

Je suis passé par copier, déplacer, xcopy et robocopy, et le plus proche est que vous pouvez dire à robocopy "copier A à B, mais ne pas écraser les nouveaux fichiers avec des fichiers plus anciens", mais cela ne fonctionne pas pour moi . J'ai regardé xxcopy, mais je l'ai abandonné, car je ne veux pas avoir de dépendance d'un tiers sur un événement post-build de Visual Studio qui nécessitera que d'autres utilisateurs SVN aient cet outil installé pour faire 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èles T4 pour les nouveaux objets de modèle EF soient distribués dans les dossiers de projet auxquels ils appartiennent, mais régénérés pour les objets existants ne remplace pas les fichiers de destination potentiellement modifiés.

Puisque le template T4 se régénère, le fichier source est toujours plus récent, et je ne peux pas utiliser le switch "newer" 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 un fichier DisplayTemplate * .ascx).

Quelqu'un at-il des problèmes similaires, ils ont résolu?


Robocopy , ou "Robust File Copy", est une commande de réplication d'annuaire 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 en tant que fonctionnalité standard de Windows Vista, Windows 7 et Windows Server 2008.

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

Elaborer (en utilisant les réponses d'Hydrargyrum, HailGallaxar et Andy Schmidt):

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

Avec les classes modifiées, plus anciennes et plus récentes exclues, Robocopy fait exactement ce que veut l'affiche originale - sans avoir besoin de charger un environnement de script.

Références: Technet , Wikipedia
Télécharger à partir de: Lien de téléchargement de Microsoft (Dernier lien vérifié le 30 mars 2016)


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

Fichier de traitement par lots: 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"

Exemple:

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

Faites un test avant la mise en œuvre.


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

echo nnnnnnnnnnn | xcopy /-y source target

Incluez juste autant de n que les fichiers que vous copiez et répondez à toutes les questions d'écrasement.


Il ne me laissera pas commenter directement sur les messages incorrects - mais permettez-moi d'avertir tout le monde, que la définition des options / XN et / XO est inversée 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, puis indiquera si chaque fichier de la SOURCE est "PLUS Â" ou "PLUS NOUVEAU" que le fichier dans la destination.

Par conséquent, / XO exclura les fichiers OLDER SOURCE (ce qui est intuitif), pas "plus ancien que la source" comme cela a été revendiqué ici.

Si vous souhaitez copier uniquement les fichiers sources nouveaux ou modifiés, mais que vous ne souhaitez pas remplacer les fichiers de destination les plus récents, alors / XO est l'option correcte à utiliser.


La solution de Belisarius est bonne.

Pour élaborer sur cette réponse légèrement laconique:

  • /E permet à Robocopy de copier récursivement des sous-répertoires, y compris ceux qui sont vides.
  • /XC exclut les fichiers existants avec le même horodatage, mais avec des tailles de fichier différentes. Robocopy écrase normalement ceux-ci.
  • /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.

Avec les classes modifiées, plus anciennes et plus récentes exclues, Robocopy fait exactement ce que veut l'affiche originale - sans avoir besoin de charger un environnement de script.


Robocopy peut être téléchargé ici pour les systèmes où il n'est pas déjà installé. (C'est à dire 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 à l'exe robocopy. Pour ce faire, faites un clic droit sur "mon ordinateur"> propriétés> avancé> "Variables d'environnement", puis trouvez la variable système path et ajoutez ceci à la fin: "; C: \ Program Files \ Windows Resource Kits \ Tools" l'a installé. Assurez-vous de laisser les chaînes de variable de chemin qui sont déjà là et ajoutez juste le chemin additionnel.

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


Vous pouvez essayer ceci:

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

-y demande simplement d'écraser et nous pouvons répondre à toutes ces questions. Donc, cela ne ferait que copier des fichiers inexistants. :)


For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"




robocopy