Comparer contenus de dossier, et modifier nom de fichiers
Résolunicolas.74 -
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
Un script Batch vise à comparer le contenu de deux dossiers, supprimer dans le premier les fichiers présents et renommer ceux du second en ajoutant la date lorsque les noms coïncident.
Plusieurs propositions utilisent des boucles FOR et dir pour lister les fichiers, puis comparent les noms et contenus via outils comme comp ou findstr afin d'enregistrer les suppressions et les renommages.
Certaines discussions insistent sur l'ordre des actions: l'impact du renommage dans le second dossier avant toute copie vers le dossier old et les risques de duplication.
En cas de corrections, les contributeurs proposent des ajustements sur la gestion des fichiers à copier vers old et sur l'inclusion exacte de la date dans les noms, afin d'éviter des remaniements.
-
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-
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
-
-
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.-
-
-
-
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. -
-
-
-
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-
-
-
-
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
-
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 ?-
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 -
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 -
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 -
-
-
-
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-
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)
-
-