Batch - Copie de fichiers
Résolu
Bonjour, je souhaiterais savoir comment faire une copie de fichiers avec écrasement automatique seulement si les fichiers de source et destination sont différents.
Merci d'avance de me répondre :)
Merci d'avance de me répondre :)
7 réponses
-
Hello!
Sans problème,
SET "CheminFichiers=<le chemin des fichiers à copier, sans guillemets>" SET "CheminDestination=<le chemin de destination, sans guillemets>"
Les deux premières lignes définissent 2 variables, on aurais pu mettre aussi directement les chemins d'accès dans le code, mais je ne l'ai pas fait car ce n'est pas ma manière de coder.FOR /F "TOKENS=*" %%A IN (' DIR /A-D/B/S "%CheminFichiers%" ') DO (
DIR /A-D/B/S correspond à lister tous les fichiers dans tous les répertoires et sous repertoires ( /S ) de %CheminFichiers%, même si ils possèdent des attributs ( /A ), mais n'affiche pas les dossiers ( /-D ).
A cette commande ci dessus, j'attribue son résultat à la variable %%A via une boucle ( FOR /F ) en listant même les fichiers ayant des espaces ( "TOKENS=*" ) , le résultat est donc stocké dans %%A le temps de la boucle.
FOR /F "TOKENS=*" %%B IN (' DIR /A-D/B/S "%CheminDestination%" ') DO (
Même principe que dessus mais avec %CheminDestination% .
A ce niveau là, %%A correspond à tous les fichiers du chemin des fichiers à copier, et %%B correspond à tous les fichiers du chemin de destination des fichiers.
IF NOT EXIST "%%~DPB\%%~NXA" COPY /Y "%%A" "%%~DPB\%%~NXA" >NUL
SI "<chemin des fichiers de destination>\<nom et extension du fichier à copier>" n'existent pas, ALORS effectuer la copie en forçant le remplacement ( /Y , pas forcement utile dans ce cas là vu qu'on à déja vérifié qu'il n'y aura pas de remplacement étant donné que le fichier n'existe pas ) et ne rien afficher à l'écran ( >NUL )
) )
Je referme les deux parenthèses que j'ai ouvertes précédemment. -
Maintenant tu sais ;)
Bonne soirée
+ -
Salut,
Comme ceci ( fonctionne sur la comparaison de noms des fichiers.., pas le contenu ! )
SET "CheminFichiers=<le chemin des fichiers à copier, sans guillemets>" SET "CheminDestination=<le chemin de destination, sans guillemets>" FOR /F "TOKENS=*" %%A IN (' DIR /A-D/B/S "%CheminFichiers%" ') DO ( FOR /F "TOKENS=*" %%B IN (' DIR /A-D/B/S "%CheminDestination%" ') DO ( IF NOT EXIST "%%~DPB\%%~NXA" COPY /Y "%%A" "%%~DPB\%%~NXA" >NUL ) )
Exemple de chemin: C:\mesfichiers-
-
@fiuRe,
Certes, mais ceci va quand même copier les fichiers même si il y a déjà des fichiers de même noms existants, donc en écraser le contenu.
Le echo N, ne sert à rien.
Si tu veux vérifier, fait le test. -
-
-
salut
a ma connaissance, il n'existe pas de commande correspondant à ce que tu cherches, car le plus simple est de copier le fichier source quel que soit le cas de figure
- si les fichiers etaient differents, ils sont ensuite identiques
- si les fichiers etaient identiques, ils sont ensuite toujours identiques
cette copie conditionnelle suppose de comparer le contenu de ces deux fichiers et de l'ecrire s'il y a difference.
tu peux la coder avec
1. comparaison des deux fichiers
2. copie en fonction du code retour qui indique le succes ou non de la comparaison
nb: cette methode rsique d'être couteuse en temps car si les differences se situent en fin de fichier, il aura fallu lire la quasi totalite des 2 fichiers pour detecter l'ecart puis lire la totalite en vue de la copie => on aura lu presque 3 fois le fichier a copier -
Là, on est d'accord ;)
-
ContributeurMerci mais pourrais-tu m'expliquer ton code C_XX STP ?
-
ContributeurJe savais pas qu'on pouvait mettre une boucle dans une boucle... :O
Merci beaucoup pour tes explications, le sujet est définitivement clos :D