Exclusions de répertoires génériques avec Robocopy - cas étrange

16

J'ai besoin d'obtenir robocopy pour exclure tout fichier dont le chemin contient un répertoire avec un nom particulier. Par exemple, "bar":

c:\foo\bar\a.txt
c:\bar\c.txt
d:\baz\bar\flub\d.txt

doivent être exclus, mais pas

c:\foo\barf\b.txt

Voici les choses que j'ai essayées - dont chacune a été rejetée par robocopy:

/XD \bar\
/XD *\bar\*
/XD *^\bar^\*

Des idées?

Jesse
la source

Réponses:

18

Il s'avère que les correspondances / XD sur le nom du répertoire - pas le chemin complet. Vous n'avez donc pas à vous soucier de faire correspondre les barres obliques inverses.

Donc, pour exclure des répertoires (n'importe où dans le chemin) appelés "bar", une simple barre / XD fonctionnera. Si vous souhaitez également exclure "barf", vous pouvez utiliser / XD bar *.

Parfois, la réponse est plus simple que vous ne le pensez.

Jesse
la source
4

Une partie de l'échec consiste à utiliser un \ dans Robocopy de fin lorsque vous faites référence à un répertoire - qui est un non-non - car Robocopy essaie de l'interpréter comme un caractère d'échappement. Presque tout le monde fait cette erreur d'une manière ou d'une autre avec Robocopy. Dans cet esprit, cet exemple fonctionnera:

/XD "\Bar"

Si vous souhaitez faire correspondre une structure de dossiers plus spécifique (afin de ne pas faire correspondre les autres sous-dossiers, vous pouvez ajouter plus de détails, comme:

/XD "\Foo\Bar"
/XD "C:\Foo\Bar"
Micheal Espinola
la source
2
Les exclusions génériques ne fonctionnent pas. Robocopy générera une erreur si vous essayez. Avez-vous testé vos exemples?
user1751825
Je l'ai fait et l'utilise, sauf pour le fait que j'ai ajouté par erreur un astérisque à mon exemple, pour lequel je pense que je confond la syntaxe avec le commutateur / XF. J'ai corrigé ma réponse. Merci.
Micheal Espinola
1

Si vous essayez différents filtres de répertoire, assurez-vous d'effacer votre dossier de destination entre les modifications!

Un problème pour moi était que je ne savais pas que le commutateur Ignorer le répertoire était également appliqué aux dossiers de destination. J'avais exécuté robocopy avec /MIRet changé le répertoire source, et mon répertoire de destination a été mis à jour comme prévu. Ensuite, j'ai remarqué que j'avais des dossiers d'archives que je ne voulais pas, alors j'ai ajouté /XD archive, mais mon dossier de destination contenait toujours des dossiers d'archives!

Après avoir joué avec les caractères génériques et inclus / exclu les \s, j'ai finalement essayé de supprimer le dossier de destination et de relancer le script - cette fois, il n'avait pas les dossiers d'archives! Voici la commande que j'exécutais, avec les noms de répertoire modifiés pour protéger les innocents:

robocopy \\SERVER\Some\Folder\Path .\Some\Relative\Path /Copy:DAT /Mir /R:0 /W:1 /XD archive*
tehDorf
la source
0

Je suis désolé, mais selon la documentation sur https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy :

/ xf <FileName> [...] Exclut les fichiers qui correspondent aux noms ou chemins spécifiés. Notez que FileName peut inclure des caractères génériques (* et?).
/ xd <Directory> [...] Exclut les répertoires qui correspondent aux noms et chemins spécifiés.

Cela signifie donc spécifiquement que le caractère générique peut être utilisé dans l'indicateur / xf mais pas dans l'indicateur / xd.

Peter
la source