Robocopy ne copie pas le dossier racine et son horodatage

10

Robocopy ne copie pas le dossier racine et son horodatage - il copie tous les sous-répertoires et fichiers (lorsque les options appropriées sont définies) et il ne semble y avoir aucune option / argument pour dire à Robocopy que vous voulez le dossier racine lui-même et son horodatage ou ses attributs à copier mot pour mot également.

Alors dis je veux je veux copier C: / Brushes

Robocopy copiera tous ses sous-répertoires et fichiers dans la destination, mais pas le dossier Brushes lui-même, avec tous les attributs et l'horodatage associés.

Tu comprends ce que je demande? C'est assez basique et Robocopy semble manquer d'une option pour cela. Les gens ont déjà posé la question dans divers forums, mais en ce qui me concerne, personne n'a répondu à la question.

entrez la description de l'image ici

ptrcao
la source
1
Ceci est un flyer, basé sur mon expérience rsync, mais que faire si vous n'avez pas de barre oblique à la fin de votre dossier cible? Que diriez-vous d'essayer de modifier le script au niveau de la ligne de commande au lieu d'utiliser l'interface graphique? Je sais pertinemment que l'outil de ligne de commande fera ce dont vous avez besoin.
@Randolph West: actuellement, je n'ai pas de barre oblique à la fin du dossier cible. Je ne peux toujours pas faire en sorte que Robocopy inclue le dossier source et ses attributs, etc. dans le travail de copie réel. Des idées?
ptrcao
S'il n'y a pas de solution pour robocopy, vous pouvez jeter un œil à xxcopy (il existe des versions gratuites et commerciales).
harrymc
Oui, je comprends parfaitement et j'ai ajouté une solution de travail ci-dessous. Le vrai problème est que vous devez spécifier tous les fichiers et dossiers de la racine à NE PAS copier.
opsine

Réponses:

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

Déposez un dossier sur batou utilisez dans Envoyer vers . Il créera un dossier avec le nom et l'horodatage du répertoire source et copiera tous les fichiers.

Terence
la source
merci beaucoup, cherchait cet opérateur magique% ~ n1
hotzen
@hotzen, que fait le %~n1?
Pacerier
"Développe% 1 en un nom de fichier."
hotzen
Microsoft a rompu tous leurs liens, voici la documentation relative au pourcentage de tilde pour le batch, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf
3

Je suis d'accord avec l'OP, ne pas pouvoir copier le dossier racine est un gros défaut de robocopy. Que diriez-vous de tricher et de déplacer le dossier pinceaux dans un dossier temporaire, d'effectuer l'opération de photocopie sur le dossier temporaire, puis de le déplacer à nouveau?

Quelque chose comme:

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
la source
2

Essayez à md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushespartir de la ligne de commande, en remplaçant les bons chemins.

ctype.h
la source
3
Oui, mais vous créez un nouveau dossier qui n'aura pas les attributs du dossier C: \ brushes d'origine ...?
ptrcao
2

Comme je ne vois aucune solution bonne et facile dans aucune des réponses:

S'il n'y a pas de solution pour robocopy, vous pouvez jeter un œil à xxcopy (il existe des versions gratuites et commerciales).

Il existe bien sûr de nombreuses autres alternatives à la robocopie, certaines sont répertoriées ici .
Voir aussi Meilleur utilitaire de copie de fichiers gratuit .

harrymc
la source
1
xxcopyest un excellent utilitaire, mais la version du logiciel gratuit a une invite à laquelle vous devez répondre si vous utilisez l'une des grandes listes de commutateurs de ligne de commande. À l'aide xxcopyd'une fenêtre de commande, cette invite supplémentaire est irritante. Mais cela empêche (complique) l'utilisation d' xxcopyun fichier batch.
Kevin Fegan
1

La réponse de user105198 est à mi-chemin,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes va en effet juste créer un nouveau dossier. Vous aurez besoin de append / MIR et / dcopy: T à elle

Avec l' option / mir , si le répertoire de destination existe, les paramètres de sécurité du répertoire de destination sont remplacés. Technet

/DCOPY:T :: COPY Directory Timestamps.

combinés ensemble, cela signifie que les attributs et les horodatages du répertoire source seront reflétés dans le dossier créé.

donc:

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

la source
1

Je pense que vous constaterez que Robocopy fait exactement ce que vous voulez, à condition de lui demander de copier les horodatages du dossier (/ DCOPY: T). D'après mes expériences, j'ai trouvé que le comportement suivant (apparemment non documenté) était vrai pour Robocopy:

Toutes les propriétés spécifiées du répertoire source sont appliquées au répertoire de destination, que le répertoire de destination existe, n'existe pas ou porte un nom différent du répertoire source.

Les propriétés spécifiées peuvent inclure (au moins) les informations de sécurité (/ SEC) ou les horodatages du dossier (/ DCOPY: T).

Par conséquent, dans l'exemple suivant, le dossier c: \ destination \ recevra les mêmes horodatages que le dossier c: \ source \.

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

J'ai testé cela avec les versions de Robocopy incluses avec Windows 7, Windows 8 et le Kit de ressources Windows 2003 (paramètre / SEC uniquement). Notez que seules les versions plus récentes de Robocopy (XP026 et supérieures) prennent en charge le paramètre / DCOPY: T.

btriffles
la source
0

Si vous combinez /IF :: Include the following Files.avec /E :: copy subdirectories, including Empty ones.vous obtenez (proche) l'effet souhaité:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
ta.speot.is
la source
1
Que voulez-vous dire par "proche de"? Quelle est la limitation que vous impliquez?
ptrcao
Danger Will Robinson !!! Votre suggestion semble copier tous les dossiers du dossier en cours, pas les limiter aux dossiers commençant par "Brushes"
GlennFromIowa
0

Robocopy n'est pas vraiment conçu pour le faire facilement. Cependant, il existe un moyen.

Le dossier racine contient disons 50 fichiers et 40 dossiers. Vous ne voulez que le dossier X (mais vous voulez aussi son horodatage).

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

Le / DCOPY: T lui dit de conserver les horodatages du dossier. Le / XF spécifie les fichiers à NE PAS copier, / XD spécifie les dossiers à NE PAS copier. Ne spécifiez simplement pas le dossier c: \ X.

Le principal inconvénient est de rechercher tous les dossiers et noms de fichiers à la racine et de les appeler spécifiquement tous ici. Si vous faites cela souvent sur différents systèmes, un script pourrait être écrit.

Exemple de travail

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

Exemple de travail racine

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

Mon test a fonctionné, je crée quelques dossiers et sous-dossiers, c: \ testing était root dans ce cas, c: \ abc était root d'un autre lecteur (évidemment ils ne le sont pas vraiment, mais à cet effet cela devrait avoir du sens). Le dossier que je voulais depuis la racine s'appelait "Nouveau dossier", comme vous pouvez le voir, je ne l'ai pas spécifié dans le / XD. Assurez-vous également que vous spécifiez le c: \ ou les noms que vous utilisez seront globaux. En d'autres termes, si je ne spécifiais pas c: \ testing in à partir du fichier Testing.txt, il l'omettrait de TOUS les sous-dossiers copiés. La / SEC copiera tous les horodatages de sécurité et d'horodatage.

opsin
la source
Hmmm, je suppose que vous pourriez utiliser / XF c: *. * Pour exclure tous les fichiers racine. Je vais tester cela quand je suis devant une machine et non sur un téléphone.
opsin
Non, c: *. * N'est pas valide, vous devrez lister manuellement tous les fichiers.
opsin
0

En théorie, l'utilisation /DCOPY:Tdevrait résoudre tous vos problèmes.

Mais, j'ai vu cela se produire, et je ne suis pas sûr que j'appellerais cela un "bug", mais plutôt une conséquence de la séquence des opérations (OK, bug).

Cette commande doit fonctionner pour copier tous les fichiers de C:\Brushesvers D:\NEWBrusheset /DCOPY:Tdoit entraîner la copie des horodatages du dossier source dans le dossier de destination:

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

Ce que j'ai vu (au moins sur certaines versions de Robocopy), c'est que la commande réussit, mais l'horodatage du D:\NEWBrushesdossier est défini sur la date et l'heure actuelles.

Il semble donc que la /DCOPY:Tfonctionnalité ne fonctionne pas pour le dossier "de base" (le plus haut) que vous copiez.

Je crois que cela fonctionne, mais que l'horodatage du dossier de destination est "piétiné" par des opérations plus tard dans la séquence d'opérations.

Je pense que ce qui se passe pour cette commande:

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

est quelque chose comme ça:

  1. Créer un dossier D:\NEWBrushess'il n'existe pas déjà
  2. Copiez l'horodatage de C:\BrushesàD:\NEWBrushes
  3. Copiez des fichiers et des sous-dossiers de C:\BrushesversD:\NEWBrushes

Il semble qu'à l'étape 3, la modification du contenu du dossier D:\NEWBrushesentraîne le D:\NEWBrusheschangement d' horodatage de .

Pour moi, la "solution de contournement" a consisté à exécuter la robocopycommande pour copier les fichiers et les dossiers, puis à exécuter la (même) robocopycommande une deuxième fois.

Donc, la première fois que vous exécutez:

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

tous les fichiers et dossiers seront copiés. Puis le relancer:

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

La deuxième fois robocopy, aucun fichier ou dossier D:\NEWBrushesne sera modifié et l' /DCOPY:Toption indiquera robocopyde copier l'horodatage de C:\Brushesà D:\NEWBrushes(sauf s'il y a des dossiers / fichiers C:\Brushesqui ont changé depuis la première exécution de robocopy).

Kevin Fegan
la source
-1

Je résolvais les dossiers racine en ce moment pour un script de sauvegarde très rapide et facile avec robocopy, il y a un exemple. Devrait aider quelqu'un:

$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
la source
Alors utilisez ce PowerScript et le problème est résolu, non?
Pimp Juice IT