Robocopy no copia la carpeta raíz y su marca de tiempo

10

Robocopy no copia la carpeta raíz y su marca de tiempo: copia todos los subdirectorios y archivos (cuando se establecen las opciones apropiadas) y parece que no hay opción / argumento para decirle a Robocopy que desea la carpeta raíz en sí y su marca de tiempo o atributos para ser copiado literalmente también.

Entonces digamos que quiero, quiero copiar C: / Pinceles

Robocopy copiará todos sus subdirectorios y archivos en el destino, pero no la carpeta Brushes en sí, con todos los atributos asociados y la marca de tiempo.

¿Entiendes lo que te estoy preguntando? Esto es bastante básico y Robocopy parece carecer de una opción para ello. La gente ha planteado la pregunta antes en varios foros, pero en lo que a mí respecta, nadie ha respondido la pregunta.

ingrese la descripción de la imagen aquí

ptrcao
fuente
1
Este es un volante, basado en mi experiencia rsync, pero ¿qué pasa si no tiene una barra diagonal al final de su carpeta de destino? ¿Qué tal intentar modificar el script a nivel de línea de comandos en lugar de usar la GUI? Sé con certeza que la herramienta de línea de comandos hará lo que necesita.
@Randolph West: actualmente no tengo una barra diagonal al final de la carpeta de destino. Todavía no puedo hacer que Robocopy incluya la carpeta de origen y sus atributos, etc. en el trabajo de copia real. ¿Algunas ideas?
ptrcao
Si no hay una solución para robocopy, puede echar un vistazo a xxcopy (hay versiones gratuitas y comerciales).
harrymc
Sí, entiendo completamente y he agregado una solución de trabajo a continuación. El verdadero problema es que debe especificar todos los archivos y carpetas en la raíz que NO debe copiar.
Abierto el

Respuestas:

9
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30 

Suelta una carpeta en bato úsala en Enviar a . Creará una carpeta con el nombre y la marca de tiempo del directorio de origen y copiará todos los archivos.

Terence
fuente
muchas gracias, estaba buscando ese operador mágico% ~ n1
hotzen
@hotzen, ¿qué hace %~n1?
Pacerier
"Expande% 1 a un nombre de archivo".
hotzen
Microsoft rompió todos sus enlaces, aquí tiene la documentación del porcentaje de tilde para el lote, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf
3

Estoy de acuerdo con el OP, no poder copiar la carpeta raíz es una gran deficiencia de robocopy. ¿Qué hay de hacer trampa y mover la carpeta de pinceles a una carpeta temporal, realizar la operación robocopy en la carpeta temporal y luego volver a moverla?

Algo como:

md "c:\verytemporary" && move "c:\brushes" "C:\verytemporary"||( echo Line 1 error occurred & goto :eof )
robocopy c:\verytemporary d:\ /MIR /DCOPY:T
move "c:\verytemporary\brushes" "c:\" && rd /q "c:\verytemporary"||echo Line 3 error occurred
Jimadine
fuente
2

Intente md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesdesde la línea de comandos, sustituyendo las rutas correctas.

ctype.h
fuente
3
Sí, pero está creando una nueva carpeta que no tendrá los atributos de la carpeta original C: \ brushes ...?
ptrcao
2

Como no puedo ver ninguna solución buena y fácil en ninguna de las respuestas:

Si no hay una solución para robocopy, puede echar un vistazo a xxcopy (hay versiones gratuitas y comerciales).

Por supuesto, hay muchas otras alternativas a la robocopia, algunas se enumeran aquí .
Consulte también la Mejor utilidad de copia de archivos gratuita .

harrymc
fuente
1
xxcopyes una gran utilidad, pero la versión gratuita tiene un mensaje al que debe responder si utiliza cualquiera de una gran lista de modificadores de línea de comandos. Utilizando xxcopydesde una ventana de comandos, este mensaje adicional es irritante. Pero evita (complica) el uso de xxcopyun archivo por lotes.
Kevin Fegan
1

La respuesta de user105198 es la mitad,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes de hecho solo creará una nueva carpeta. Usted tendrá que anexar / MIR y / DCOPY: T a ella

Con la opción / mir , si existe el directorio de destino, se sobrescribe la configuración de seguridad del directorio de destino. Technet

/DCOPY:T :: COPY Directory Timestamps.

combinado, significa: los atributos del directorio de origen y las marcas de tiempo se reflejarán en la carpeta creada.

entonces:

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes /MIR /DCOPY:T

fuente
1

Creo que encontrará que Robocopy hace exactamente lo que quiere, siempre que le indique que copie las marcas de tiempo de la carpeta (/ DCOPY: T). De mis experimentos, he encontrado que el siguiente comportamiento (aparentemente indocumentado) es cierto para Robocopy:

Todas las propiedades especificadas del directorio de origen se aplican al directorio de destino, independientemente de si el directorio de destino existe, no existe o si tiene un nombre diferente del directorio de origen.

Las propiedades especificadas pueden incluir (al menos) la información de seguridad (/ SEC) o las marcas de tiempo de la carpeta (/ DCOPY: T).

Por lo tanto, en el siguiente ejemplo, a la carpeta c: \ destination \ se le asignarán las mismas marcas de tiempo que a la carpeta c: \ source \.

robocopy c:\source\folder C:\destination\folder /E /DCOPY:T

Probé esto con las versiones de Robocopy incluidas con Windows 7, Windows 8 y el Kit de recursos de Windows 2003 (solo parámetro / SEC). Tenga en cuenta que solo las versiones más recientes de Robocopy (XP026 y superior) admiten el parámetro / DCOPY: T.

btriffles
fuente
0

Si combina /IF :: Include the following Files.con /E :: copy subdirectories, including Empty ones.usted obtiene (cerca de) el efecto deseado:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
ta.speot.is
fuente
1
¿Qué quieres decir con "cerca de"? ¿Cuál es la limitación que estás implicando?
ptrcao
¡Peligro Will Robinson! Su sugerencia parece copiar cada carpeta en la carpeta actual, no limitarla a las carpetas que comienzan con "Pinceles"
GlennFromIowa
0

Robocopy no está realmente diseñado para hacerlo fácilmente. Sin embargo, hay un camino.

La carpeta raíz contiene, digamos, 50 archivos y 40 carpetas. Solo desea la carpeta X (pero también desea que sea la marca de fecha y hora).

ROBOCOPY c:\ d:\ /XF 50 root file names c:\boot.ini c:\bla.txt etc. /XD c:\windows c:\drivers c:\temp etc. /S /E /SEC /DCOPY:T

El / DCOPY: T le dice que mantenga las marcas de tiempo de la carpeta. / XF especifica qué archivos NO copiar, / XD especifica qué carpetas NO copiar. Simplemente no especifique la carpeta c: \ X.

El principal inconveniente de esto es investigar todas las carpetas y nombres de archivos en la raíz y llamarlos específicamente a todos aquí. Si está haciendo esto mucho en diferentes sistemas, se podría escribir un script.

Ejemplo de trabajo

robocopy c: \ testing c: \ abc / XF c: \ testing \ Testing.txt / XD "C: \ testing \ Nueva carpeta (2)" "C: \ testing \ Nueva carpeta (3)" / S / E / SEC / DCOPY: T

Ejemplo de trabajo de raíz

robocopy c: \ d: \ / XF c: \ Testing.txt / XD "C: \ Nueva carpeta (2)" "C: \ Nueva carpeta (3)" / S / E / SEC / DCOPY: T

Mi prueba funcionó, creo algunas carpetas y subcarpetas, c: \ testing era root en este caso, c: \ abc era root de otra unidad (obviamente no lo son realmente, pero para este propósito debería tener sentido). La carpeta que quería desde la raíz se llamaba "Nueva carpeta", como puede ver, no la especifiqué en / XD. Además, asegúrese de especificar c: \ o los nombres que use serán globales. En otras palabras, si no especifico c: \ testing desde el archivo Testing.txt, lo omitiría de TODAS las subcarpetas que se copian. El / SEC copiará todos los sellos de seguridad y hora del archivo.

opsin
fuente
Hmmm, supongo que podría usar / XF c: *. * Para excluir todos los archivos raíz. Lo probaré cuando esté frente a una máquina y no en un teléfono.
opsina
No, c: *. * No es válido, tendrá que enumerar manualmente todos los archivos.
opsina
0

En teoría, el uso /DCOPY:Tdebería resolver todos sus problemas.

Pero, he visto que esto sucede, y no estoy seguro de llamarlo "error", sino más bien una consecuencia de la secuencia de operaciones (OK, error).

Este comando debería funcionar para copiar todos los archivos de C:\Brushesa D:\NEWBrushes, y /DCOPY:Tdebería hacer que las marcas de tiempo de la carpeta de origen se copien en la carpeta de destino:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

Lo que he visto (al menos en algunas versiones de Robocopy) es que el comando tiene éxito, pero la marca de tiempo de la D:\NEWBrushescarpeta está configurada en la fecha y hora actuales.

Por lo tanto, parece que la /DCOPY:Tfunción no funciona para la carpeta "base" (superior) que está copiando.

Creo que está funcionando, pero que la marca de tiempo de la carpeta de destino está siendo "pisada" por operaciones que se encuentran más adelante en la secuencia de operaciones.

Lo que creo que está sucediendo para este comando:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

es algo como esto:

  1. Crear carpeta D:\NEWBrushessi aún no existe
  2. Copie la marca de tiempo de C:\BrushesaD:\NEWBrushes
  3. Copie archivos y subcarpetas de C:\BrushesaD:\NEWBrushes

Parece que el Paso 3, la modificación del contenido de la carpeta D:\NEWBrusheshace D:\NEWBrushesque cambie la marca de tiempo de .

Para mí, la "solución" ha sido ejecutar el robocopycomando para copiar los archivos y carpetas, luego ejecutar el (mismo) robocopycomando por segunda vez.

Entonces, la primera vez que corres:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

Todos los archivos y carpetas serán copiados. Luego ejecutándolo nuevamente:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T
  (or)
robocopy "C:\Brushes" "D:\NEWBrushes" /DCOPY:T

La segunda vez que se robocopyejecuta, no D:\NEWBrushesse modificarán archivos ni carpetas , y la /DCOPY:Topción le indicará robocopyque copie la marca de tiempo de C:\Brushesa D:\NEWBrushes(a menos que haya carpetas / archivos C:\Brushesque hayan cambiado desde la primera ejecución de robocopy).

Kevin Fegan
fuente
-1

Estaba resolviendo las carpetas raíz en este momento para un script de copia de seguridad realmente rápido y fácil con robocopy, hay un ejemplo. Debería ayudar a cualquiera:

$Destination="F:\Backup" #change destionation backup drive and foder
$BackupDirs="d:\folder1", "d:\folder2", "d:\folder3\subfolder", "d:\fodler4\subfolder\subsubfodler" #change source folders

#make a loop for every source folder
foreach ($Backup in $BackupDirs) {

#split folder name
$fdname = Split-Path $Backup -leaf

#define folder to create in destionation
$dirtocreate = Join-Path $Destination $fdname

#make directory, yes, some extra script to skip when exist should be in place, but -erroraction solved this in lazy mode :)
md $dirtocreate -ErrorAction SilentlyContinue 

#copy with subfolders and log
robocopy $backup $dirtocreate  /s /nfl /ndl /log:c:\scripts\backup.log

}
Milhauzz
fuente
Entonces use este PowerScript y el problema se resuelve, ¿verdad?
Pimp Juice IT