2010-11-19 80 views
72

Parece que no puedo encontrar la manera en la línea de comandos para decir "copiar todos los archivos del directorio A al directorio B, pero si el archivo ya existe en el directorio B, no lo sobrescriba , no importa qué archivo sea más nuevo, y no me pregunte ".Copiar archivos sin sobreescribir

He estado a través de copiar, mover, copiar & robocopy, y lo más cerca que puedo encontrar es que se puede decir a robocopy "copiar A a B, pero no sobrescribir archivos más nuevos con archivos antiguos", pero eso no t trabajo para mi Miré xxcopy, pero lo descarté, ya que no quiero tener una dependencia de terceros en un evento de post-construcción de Visual Studio que requerirá que otros usuarios de SVN tengan esa herramienta instalada para hacer la compilación.

Quiero añadir una línea de comandos para el evento posterior a la generación en Visual   Estudio   2010 para que los archivos que se generan a partir de los T4 plantillas para nuevas EF objetos del modelo se distribuyen a las carpetas de proyectos a los que pertenecen, pero los archivos regenerados para objetos existentes no sobrescriben archivos de destino potencialmente editados.

Dado que la plantilla T4 se regenera, el archivo fuente siempre es más nuevo y no puedo usar el conmutador "más nuevo" de manera confiable, no creo.

Uso las clases parciales para aquellos elementos para los que puedo, pero hay otras cosas que genero que no pueden usar clases parciales (por ejemplo, generar un Editor predeterminado o un archivo DisplayTemplate * .ascx).

¿Alguien tiene problemas similares que hayan resuelto?

+0

¿Está familiarizado con el comando 'for' de' cmd.exe'? Si no, te recomiendo que ejecutes 'for /?' Y lo uses. – Gabe

Respuesta

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

Esto funcionó para mí, pero tuve que usar símbolos de dos por ciento en lugar de uno porque estaba ejecutando esto desde un archivo por lotes en lugar de desde la línea de comandos. Reemplacé instancias de% F con %% F e instancias de% ~ nxF con %% ~ nxF. – Owen

+0

¿Qué significa exactamente '~ nx' en'% ~ nxF'? –

+0

@Serge: larga historia. Corre por /? para leerlo – Stu

151

Robocopy, o "Copia de archivos robusto", es un comando de línea de comandos de replicación de directorios. Ha estado disponible como parte del Kit de recursos de Windows a partir de Windows NT 4.0, y fue introducido como una característica estándar de Windows Vista, Windows 7 y Windows Server 2008.

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

Elaborar (usando Hydrargyrum , HailGallaxar y Andy Schmidt respuestas):

  • /E hace Robocopy copia recursivamente los subdirectorios, incluyendo los vacíos.
  • /XC excluye los archivos existentes con la misma marca de tiempo, pero diferentes tamaños de archivo . Robocopy normalmente sobrescribe aquellos.
  • /XN excluye los archivos existentes más recientes que la copia en el directorio de destino . Robocopy normalmente sobrescribe aquellos.
  • /XO excluye archivos existentes más antiguos que la copia en el directorio de destino . Robocopy normalmente sobrescribe aquellos.

Con las clases modificadas, antiguas y nuevas excluidas, Robocopy hace exactamente lo que el póster original desea, sin necesidad de cargar un entorno de scripting.

Referencias: Technet, Wikipedia
Descarga desde: Microsoft Download Link(Enlace verificado última el 30 mar, 2016)

+0

¿Por 'excluir' quiere decir 'omitir' o 'eliminar/eliminar'? –

+0

@Andre Terra: Skip, normalmente. Si está usando la bandera/MIR, podría eliminarlos. No lo he probado. – Hydrargyrum

+0

Con/MIR, los archivos que no existen en la fuente se eliminan. Pero cuando también se utilizan/XN y/XO, los archivos que existen en ambos lugares simplemente se saltan (no estoy seguro de si el tamaño está marcado). Esto es ideal para mi situación donde necesito copiar una versión más nueva o más antigua de mi aplicación, pero donde los sellos de fecha modificados de las bibliotecas que utiliza la aplicación son incorrectos, sin embargo, los nombres de los archivos contienen su número de versión. –

5

Aquí está en archivo por lotes formulario:

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

Esta debería ser la respuesta más importante ... – thab

+0

Ah, me gustan las secuencias como '% \ %% ~' y "mucho" ... – avp

41

solución Belisario es bueno.

dar más detalles sobre esa respuesta poco escueta:

  • /E hace Robocopy copia recursivamente los subdirectorios, incluyendo los vacíos.
  • /XC excluye los archivos existentes con la misma marca de tiempo, pero diferentes tamaños de archivo . Robocopy normalmente sobrescribe aquellos.
  • /XN excluye los archivos existentes más nuevos que la copia en el directorio origen . Robocopy normalmente sobrescribe aquellos.
  • /XO excluye archivos existentes más antiguos que la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.

Con las clases modificadas, antiguas y nuevas excluidas, Robocopy hace exactamente lo que el póster original desea, sin necesidad de cargar un entorno de scripting.

1

Robocopy se puede descargar aquí para sistemas en los que aún no está instalado. (Es decir, Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (sin reiniciar el sistema para la instalación)

Recuerde establecer su camino hacia el exe robocopy. Para ello, haga clic derecho en "mi computadora"> propiedades> avanzado> "Variables de entorno", luego encuentre la variable del sistema de ruta y agréguela al final: "; C: \ Archivos de programa \ Kits de recursos de Windows \ Herramientas" o lo instaló. Asegúrese de dejar las cadenas de variables de ruta que ya están allí y anexe la ruta de acceso adicional.

una vez que se establece la ruta, puede ejecutar el comando que sugiere belisarius. Funciona muy bien.

2

Solo quiero aclarar algo de mis propias pruebas.

@Hydrargyrum escribió:

  • /XN excluye archivos existentes más recientes que la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.
  • /XO excluye los archivos existentes anteriores a la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.

Esto es realmente al revés. XN hace archivos "eXclude Newer", pero excluye archivos que son más nuevos que la copia en el directorio de destino .XO "eXclude Older", pero excluye archivos que son anteriores a la copia en el directorio de destino .

Por supuesto, haz tus propias pruebas como siempre.

+1

¿Es esta una respuesta a la pregunta original, o un comentario sobre la respuesta de otra persona? ? – ASGM

+1

¿La respuesta de Hydrargyrum tiene +25 votos al momento de escribir una respuesta a la pregunta original, o un comentario sobre la respuesta de otra persona? –

30

Puede probar esto:

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

-y simplemente pregunta antes de sobrescribir y podemos tubería n a todas esas preguntas. Así que esto básicamente sería copiar archivos que no existen. :)

+0

Eso es genial. No sabía que Windows podría funcionar así. – avp

+1

Maravillosamente simple. – Holf

+0

Se debe aceptar la respuesta –

2

Hay una extraña manera de hacer esto con xcopy:

echo nnnnnnnnnnn | xcopy /-y source target 

Sólo incluir el mayor número n de archivos como va a copiar, y que responderá n a todas las preguntas de sobreescritura.

+0

Es un jank, pero funciona. (Utilicé copia.) –

1

No me dejará comentar directamente los mensajes incorrectos, pero permítanme advertir a todos que la definición de las opciones/XN y/XO se INVERTIR en comparación con lo que se ha publicado en mensajes anteriores.

La Excluir opción menos recientes/archivos más nuevos es consistente con la información que aparece en el registro de Robocopy: Robocopy se repetirá a través de la fuente y luego informar si cada archivo de la fuente es "mayor" o "nuevo" que el archivo en el destino .

En consecuencia,/XO excluirá los archivos OLDER SOURCE (que es intuitivo), no "anteriores a la fuente" como se ha afirmado aquí.

Si solo desea copiar archivos fuente nuevos o modificados, pero no debe reemplazar archivos de destino más recientes, entonces/XO es la opción correcta de usar.

0

Un enfoque simple sería usar la opción/MIR, para reflejar los dos directorios. Básicamente copiará solo los nuevos archivos a destino. En el próximo comando, reemplace el origen y el destino con las rutas a sus carpetas, el script buscará cualquier archivo con extensiones.

robocopy <source directory> <destination directory> *.* /MIR 
0

Esto es lo que funcionó para mí. Lo uso para "agregar" archivos a la otra unidad, sin sobreescribir.

archivo por lotes: 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" 

Ejemplo:

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

DO test antes de la implementación.

2
robocopy src dst /MIR /XX 

/XX: archivos eXclude "eXtra" y directorios (presentes en el destino pero no en el origen). Esto evitará cualquier eliminación del destino. (este es el valor predeterminado)

Cuestiones relacionadas