Comparer contenus de dossier, et modifier nom de fichiers
Résolu
nicolas.74
-
nicolas.74 -
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
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
A voir également:
- Comparer contenus de dossier, et modifier nom de fichiers
- Modifier dns - Guide
- Vous avez besoin d'une autorisation de la part de système pour modifier ce dossier - Guide
- Dossier appdata - Guide
- Modifier liste déroulante excel - Guide
- Impossible de supprimer un dossier - Guide
6 réponses
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
Voilà le script avec la suite :
J'ai également intégré tes modifications, j'espère que ça te convient.
@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.
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
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 :
Juste un petit détail à corriger dans la nouvelle étape mais ça n'est pas gênant.
A quoi sert ton cd à la fin ?
@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
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
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
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
==>> 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 ?
Parce que j'ai beau la décortiquer dans tous les sens j'arrive pas à comprendre
Merci d'avance,
Nicolas
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)
Voilà mon code final: