Comparer contenus de dossier, et modifier nom de fichiers

Résolu/Fermé
nicolas.74 - Modifié le 24 mars 2017 à 15:54
 nicolas.74 - 29 mars 2017 à 09:55
Bonjour,
je cherche à faire un script en Batch pour comparer le contenu de 2 dossier, si des fichiers sont existant dans les deux dossier les supprimer dans le premier dossier, et si 2 fichiers ne sont pas identiques mais ont les mêmes noms alors modifier le nom dans le dossier 2 et rajouter la date.
Mais je trouve absolument rien, quelqu'un arriverait à m'aider?

Merci,
Nicolas

6 réponses

barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
Modifié le 27 mars 2017 à 13:58
Slt

@echo off

set dossier1=%USERPROFILE%\Tests1
set dossier2=%USERPROFILE%\Tests2

if not exist "%dossier1%" goto :eof
if not exist "%dossier2%" goto :eof

set liste1=%USERPROFILE%\efface.txt
set liste2=%USERPROFILE%\renomme.txt

if exist "%liste1%" (del "%liste1%")
if exist "%liste2%" (del "%liste2%")

for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.*"') do (

for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.*"') do (

if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)

if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)

)
)

cls

if not exist "%USERPROFILE%\efface.txt" goto suite
cd %dossier1%

for /f "tokens=*" %%C in (%liste1%) do (del "%%C" && echo Suppression de : %dossier1%\%%C)

:suite
if not exist "%USERPROFILE%\renomme.txt" goto fin
cd %dossier2% & echo.

for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%%date:~3,2%%date:~0,2%%%~xD" && echo Renommage de : %dossier2%\%%D)

:fin

echo. & pause

exit
1
Tooooooooooooooooooooooooop merci ! Je l'ai adapté un peu pour que ça corresponde à ma situation, et tout à l'air de fonctionner, tu me sauves la vie !

Voilà mon code final:

@echo off

if exist C:\Users\thibaxav\Desktop\script\temp\ rmdir /s /q C:\Users\thibaxav\Desktop\script\temp\
MD C:\Users\thibaxav\Desktop\script\temp\
For /f "tokens=*" %%a In ('dir /s /b /a-d "C:\Users\thibaxav\Desktop\script\source\*_IT.docx"') Do (Xcopy "%%a" "C:\Users\thibaxav\Desktop\script\temp")

set dossier1=C:\Users\thibaxav\Desktop\script\temp
set dossier2=C:\Users\thibaxav\Desktop\script\dossierfinalavectouslesfichiers

set liste1=%USERPROFILE%\efface.txt
set liste2=%USERPROFILE%\renomme.txt

if exist "%liste1%" (del "%liste1%")
if exist "%liste2%" (del "%liste2%")

for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.*"') do (

for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.*"') do (

if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)
if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)

)
)

cls

if not exist "%USERPROFILE%\efface.txt" goto suite
cd %dossier2%
for /f "tokens=*" %%C in (%liste1%) do (del "%%C" && echo Suppression de : %%C dans %dossier2%)

:suite
if not exist "%USERPROFILE%\renomme.txt" goto fin
cd %dossier1% & echo.
for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%.%date:~3,2%.%date:~0,2%%%~xD" && echo Renommage de : %%D dans %dossier1%)

:fin
For /f "tokens=*" %%a In ('dir /s /b /a-d "C:\Users\thibaxav\Desktop\script\temp\*.docx"') Do (Xcopy "%%a" "C:\Users\thibaxav\Desktop\script\dossierfinalavectouslesfichiers")
cd C:\Users\thibaxav\Desktop\script\
rmdir /s /q C:\Users\thibaxav\Desktop\script\temp\
del %USERPROFILE%\renomme.txt
del %USERPROFILE%\efface.txt
exit
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
Modifié le 27 mars 2017 à 20:05
Voilà le script avec la suite :

@echo off

set dossier1=%USERPROFILE%\Desktop\script\temp
set dossier2=%USERPROFILE%\Desktop\script\dossierfinal
set dossier3=%USERPROFILE%\Desktop\script\Old

if exist "%dossier1%" rmdir /S /Q "%dossier1%"

if not exist "%dossier1%" mkdir "%dossier1%"
if not exist "%dossier2%" mkdir "%dossier2%"
if not exist "%dossier3%" mkdir "%dossier3%"

For /f "tokens=*" %%a In ('dir /s /b /a-d "%USERPROFILE%\Desktop\script\source\*_IT.docx"') Do (Xcopy "%%a" "%dossier1%")

set liste1=%USERPROFILE%\efface.txt
set liste2=%USERPROFILE%\renomme.txt

if exist "%liste1%" (del /F "%liste1%")
if exist "%liste2%" (del /F "%liste2%")

for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.*"') do (

for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.*"') do (

for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

if not exist "%dossier1%\%%~nxB" (copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nB_%%G-%%F-%%E%%~xB" > nul && echo Copie de : %dossier2%\%%~nxB)

)

if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)

if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)

)
)

cls

if not exist "%liste1%" goto suite
cd %dossier1%
for /f "tokens=*" %%C in (%liste1%) do (del /F "%%C" && echo Suppression de : %dossier1%\%%C)

:suite
if not exist "%liste2%" goto fin
cd %dossier2% & echo.
for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%-%date:~3,2%-%date:~0,2%%%~xD" && echo Renommage de : %dossier2%\%%D)

:fin
For /f "tokens=*" %%a In ('dir /s /b /a-d "%dossier1%\*.docx"') Do (Xcopy "%%a" "%dossier2%")

echo. & pause

del /F "%liste1%"
del /F "%liste2%"

exit

J'ai également intégré tes modifications, j'espère que ça te convient.
1
J'ai pas l'impression que ça fonctionne ou alors je fais quelque chose de mal dans mes dossiers, mais j'ai l'erreur "La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte"
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864 > nicolas.74
28 mars 2017 à 09:14
Tu as peut-être mal copié-collé, ou bien tu as enlevé ou rajouté un espace quelque part, ou tu as oublié un ".

Pas le temps ce matin, je re-vérifierai le script cet après-midi.
0
Pas de soucis c'est déjà super sympa de m'aider !
Bon en fait la problème vient pas des comparaisons mais de la nouvelle étape, je crois qu'il manque une ligne pour rename les fichiers, du coup il arrive pas à les copier
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864 > nicolas.74
Modifié le 28 mars 2017 à 10:52
Dans la nouvelle étape la commande copy renomme les fichiers en même temps qu'elle les copie, je suis sûr de cette partie que j'ai testé et re-testé hier.

Les seules choses que je n'ai pas testé c'est tes modifications, les 2 boucles FOR, que j'ai intégré au début et à la fin du script, sinon le reste c'est ok.
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864 > barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023
Modifié le 28 mars 2017 à 10:55
Vérifie que tu as bien laissé un espace après le slash à droite dans cette commande :

for /f "tokens=1,2,3,* delims=/ " %%E in
0
Personne ?
0
Bon, bah c'est pas fini, j'ai besoin d'aide pour la suite, lorsque un fichier n'existe plus dans la source mais existe dans le dossier de destination, il faudrait que le fichier soit copié dans un dossier "old" avec si possible le nom de dernière modification.

J'essaye des trucs mais j'arrive pas à faire quelque chose qui marche, j'ai l'impression de tourner autours du vrai but.
Quelqu'un arriverait à m'aider?

Nicolas
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
27 mars 2017 à 17:02
Qu'est-ce que tu appelles le nom de dernière modification ?

Donne un exemple.
0
Je me suis mal exprimé désolé, je voulais dire rajouter au nom la dernière date de modification.
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
Modifié le 27 mars 2017 à 17:23
Cette étape est à faire avant le reste du script alors ?

Parce que sinon les fichiers renommés avec la date du jour vont se retrouver avec une deuxième date en plus de la première.
0
Désolé de la réponse tardive, non ça ne va pas mettre deux fois le nom, parce que les fichiers qui sont rename avec la date du jour sont dans les deux répertoires, alors que maintenant il faut rename les fichiers qui ne sont que dans le répertoire 2 donc aucun risque de double rename, mais l'ordre n'a pas beaucoup d'importance
0
je corrige ce que j'ai dit, l'ordre a bien une importance, parce que si on fait cette copie des fichiers "old" à la fin, les fichiers renommés précédemment(avec la date du jour) vont aussi être copié puisqu'ils n'existent pas avec ce nom dans le dossier temp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
Modifié le 28 mars 2017 à 14:17
J'ai bien re-testé en profondeur, il n'y a pas de problème majeur :

@echo off

set dossier1=%USERPROFILE%\Desktop\script\temp
set dossier2=%USERPROFILE%\Desktop\script\dossierfinal
set dossier3=%USERPROFILE%\Desktop\script\dossierfinal\old

if exist "%dossier1%" rmdir /S /Q "%dossier1%"

if not exist "%dossier1%" mkdir "%dossier1%"
if not exist "%dossier2%" mkdir "%dossier2%"
if not exist "%dossier3%" mkdir "%dossier3%"

For /f "tokens=*" %%a In ('dir /s /b /a-d "%USERPROFILE%\Desktop\script\source\*_IT.docx"') Do (Xcopy "%%a" "%dossier1%\")

set liste1=%USERPROFILE%\efface.txt
set liste2=%USERPROFILE%\renomme.txt

if exist "%liste1%" (del /F "%liste1%")
if exist "%liste2%" (del /F "%liste2%")

for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.docx"') do (
for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.docx"') do (

for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

if not exist "%dossier1%\%%~nxB" (copy /V "%dossier2%\%%~nxB" "%dossier3%\%%~nB_%%G-%%F-%%E%%~xB" > nul && echo Copie de : %dossier2%\%%~nxB)
)

if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)

if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)
)
)

if not exist "%liste1%" goto suite
cd %dossier1%
for /f "tokens=*" %%C in (%liste1%) do (del /F "%%C" && echo Suppression de : %dossier1%\%%C)

:suite
if not exist "%liste2%" goto fin
cd %dossier2%
for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%-%date:~3,2%-%date:~0,2%%%~xD" && echo Renommage de : %dossier2%\%%D)

:fin
For /f "tokens=*" %%a In ('dir /b /a-d "%dossier1%\*.docx"') Do (Xcopy "%%a" "%dossier2%\")

cd %USERPROFILE%\Desktop\script\
rmdir /S /Q "%dossier1%"

del /F "%liste1%"
del /F "%liste2%"

exit

Juste un petit détail à corriger dans la nouvelle étape mais ça n'est pas gênant.

A quoi sert ton cd à la fin ?
0
Bon de plus en plus bizarre, avec ton dernier script, si il y a aucun fichier dans la destination ( %dossier2% ) aucune copie ne se fait, mais si il y a juste un seul fichier qui est égal au dossier temp la copie se fait bien

Mais pourtant ça marche avec la dernière version que j'ai posté.
Mais outre ce problème la copie dans old ne se fait toujours pas


De plus en plus bizarre ce script, il faudrait que j'essaye sur un autre PC
0
Sinon c'est possible de le faire en 2 commandes différentes? Parce que j'ai essayé en modifiant la ligne mais ça marche pas
if not exist "%dossier1%\%%~nxB" (copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nxB" && rename %dossier3%\%%~nxB %%~nB_%%G-%%F-%%E%%~xB )



Et j'avais pas vu la question, le dossier ne se supprimait pas sans cd et en cherchant sur internet j'ai vu quelqu'un dire qu'il fallait mettre un cd avant, je l'ai mit et depuis ça marche
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864 > nicolas.74
28 mars 2017 à 15:05
Au début j'avais fait en 2 commandes comme toi au-dessus mais impossible à faire fonctionner, ensuite j'ai compris que je pouvais copier et renommer en une seule commande et ça a marché.
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
Modifié le 28 mars 2017 à 14:59
avec ton dernier script, si il y a aucun fichier dans la destination ( %dossier2% ) aucune copie ne se fait

==>> c'est un comportement normal puisqu'il n'y a rien à comparer

Pourtant c'est exactement ce qui est demandé :

1) si 2 fichiers ont le même nom et la même taille : supprimer celui du dossier1

2) si 2 fichiers ont le même nom mais pas la même taille : renommer celui du dossier2

3) si le fichier est présent dans dossier2 mais pas dans dossier1 : le copier dans dossier3
0
nicolas.74 > barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023
28 mars 2017 à 14:51
Ah oui je comprends, je pensais pas que ça marchait comme ça
0
Bonjour,
Je reviens à vous une dernière fois, j'aime bien comprendre ce que je fais, quelqu'un arriverait à m'expliquer ce que cette commande fait ?
for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

Parce que j'ai beau la décortiquer dans tous les sens j'arrive pas à comprendre

Merci d'avance,
Nicolas
0
barnabe0057 Messages postés 14192 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 26 janvier 2023 4 864
Modifié le 29 mars 2017 à 10:08
Salut, cette commande a pour but de récupérer la date de modification d'un fichier, la commande dir permet de lister le fichier ainsi que sa date de modification, ensuite le findstr sert à supprimer les lignes superflues générées par la commande dir pour ne garder que la ligne qui contient la date, ensuite le for récupère et décompose la date en 3 parties (jour, mois, année)
0
D'accord top merci ! J'essayais de décomposer les commande une à une mais il fallait les tourner un peu pour comprendre, top merci beaucoup !



Si un modo passe par là il peut mettre le sujet en résolu? J'ai changé de PC du coup j'ai plus accès au bouton pour le mettre en résolu
0