Comparer contenus de dossier, et modifier nom de fichiers [Résolu/Fermé]

Signaler
-
 nicolas.74 -
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

Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

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
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

> nicolas.74
Oups je crois que j'avais pas copié la bonne commande, j'ai modifié


Mais du coup de cette façon j'ai l'extension alors que si je mets "%dossier3%\%%~nB" je perds l'extension, du coup c'est soit je mets "%dossier3%\%%~nB.docx" soit "%dossier3%\%%~nxB" mais j'ai toujours le problème pour renommer les fichiers
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
C'est normal que tu perdes l'extension, j'ai fait comme ça pour pouvoir intégrer la date de dernière modification dans le nom, mais je rajoute quand même l'extension :

copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nB_%%G-%%F-%%E%%~xB"

Je t'ai mis le nom et l'extension en gras, et entre les deux il y a la date.
Ah oui j'ai compris, bon par contre la copie ne se fait toujours pas, je comprends pas trop
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331 > nicolas.74
Je ne suis pas chez moi donc je ne peux pas tester.

Redonne tout le contenu de ton script et je testerai ça vers 13h30.
Ça marche merci !
Le code est presque identique j'ai juste rajouté 2 commandes à la fin pour supprimer le dossier temp

@echo off

set dossier1=%USERPROFILE%\Desktop\script\temp
set dossier2=%USERPROFILE%\Desktop\script\dossierfinalavectouslesfichiers
set dossier3=%USERPROFILE%\Desktop\script\dossierfinalavectouslesfichiers\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%)
)
)

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 /s /b /a-d "%dossier1%\*.docx"') Do (Xcopy "%%a" "%dossier2%")

cd %USERPROFILE%\Desktop\script\
rmdir /s /q %USERPROFILE%\script\temp\
del /F "%liste1%"
del /F "%liste2%"

exit
Personne ?
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
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
Qu'est-ce que tu appelles le nom de dernière modification ?

Donne un exemple.
Je me suis mal exprimé désolé, je voulais dire rajouter au nom la dernière date de modification.
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
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.
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
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
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
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 ?
C'est toujours la même qui marchait chez toi:
if not exist "%dossier1%\%%~nxB" (copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nxB" && rename %dossier3%\%%~nxB %%~nB_%%G-%%F-%%E%%~xB )
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331 > nicolas.74
Rajoute une pause au milieu du script et vérifie le contenu de %USERPROFILE%\renomme.txt
Il existe pas encore à cette commande, c'est toujours le problème au niveau des fichiers à copier dans old et renommer
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331 > nicolas.74
Ah oui je dis des conneries, moi j'étais sur l'autre rename.

Tu peux faire ce test :

for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\toto.docx" ^| findstr /V "volume pertoire octets"') do (echo %%E-%%F-%%G)

Ca doit te retourner la date de modif du fichier toto.docx
Euh ça fait rien, nan mais à la limite tant pis, je vais mettre la date du jour en nom et ça ira comme ça

Merci encore !
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
Messages postés
13421
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 mai 2021
4 331
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)
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