Script batch incorrect :(
brucine Messages postés 23023 Statut Membre -
Bonjour à tous,
Voici un petit fichier .bat qui m'expose la taille de 2 dossiers, (chacun des 2 dossiers comporte plusieurs sous dossiers et fichiers).
Jusque là, tout fonctionne, il m'affiche un 1er résultat en octets, et un second avec séparateurs de milliers.
C'est lorsque je cherche à calculer la différence de taille entre ces dossiers que ça ne va plus. Le résultat est toujours 0...
L'objectif :
* calculer la différence de taille dossier source/cible (ligne : set /a diff=size1-size2)
* afficher le résultat en octets de :taille fichier source - taille fichier cible
* si égalité (taille =0) , afficher message de type "Operation OK", sinon, afficher "Erreur"
@echo off
setlocal enabledelayedexpansion
set "target1=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
if not defined target1 set "target1=%cd%"
set "size1=0"
for /f "tokens=3,5" %%a in ('
dir /a /s /w /-c "%target1%"
^| findstr /b /l /c:" "
') do if "%%b"=="" set "size1=%%a"
echo; Taille source (C:) : %size1% octets
set "target2=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
if not defined target2 set "target2=%cd%"
set "size2=0"
for /f "tokens=3,5" %%a in ('
dir /a /s /w /-c "%target2%"
^| findstr /b /l /c:" "
') do if "%%b"=="" set "size2=%%a"
echo; Taille destination (D:) : %size2% octets
set /a diff=size1-size2
set "folder3=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
set "folder4=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release
set "size3=0"
set "size4=0"
for /f "tokens=3" %%i in ('dir /s /a "%folder3%" ^| findstr /i "fichier(s)"') do set size3=%%i
for /f "tokens=3" %%i in ('dir /s /a "%folder4%" ^| findstr /i "fichier(s)"') do set size4=%%i
echo Taille du dossier source : %size3% octets
echo Taille du dossier cible : %size4% octets
echo Difference : %diff% octets
if %diff% EQU 0 (
echo Operation OK
) else (
echo Erreur
)
pause
Et voici le retour :
Taille source (C:) : 8965660753 octets Taille destination (D:) : 8965506493 octets Taille du dossier source : 8 965 660 753 octets Taille du dossier cible : 8 965 506 493 octets Difference : 0 octets Operation OK Appuyez sur une touche pour continuer..
Ou peut être mon erreur ?
Je n'y connais rien en script batch et ne pourrai le dire, n'ayant fait qu'accumuler des lignes de commmande piochées à droite et à gauche..
- Script batch incorrect :(
- Script vidéo youtube - Guide
- Fichier batch - Guide
- Ghost script - Télécharger - Polices de caractères
- Mas script - Accueil - Windows
- Batch installation id c'est quoi - Forum Mobile
101 réponses
C'est franchement génial, tout marche.
@echo off
CHCP 65001 >NUL
SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
echo ^[93mSAUVEGARDE THUNDERBIRD[0m
:DIFF
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
IF %diff% EQU 0 GOTO NOCOPY
echo:
ECHO Taille hors fichiers de configuration:
ECHO --------------------------------------
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
echo:
echo ^[31mDifférence = %diff1% octets[0m
echo:
CHOICE /C ON /M "Procéder à la sauvegarde?"
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO QUIT
echo:
:COPY
echo:
ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims= " %%f IN ('ROBOCOPY "%orig%" "%dest%" /L /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h & CALL :PROCESS
echo:
ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
pause
:PROCESS
ECHO %size% %name%
GOTO END
:NOCOPY
echo:
echo ^[32mSynchronisation inutile[0m
echo:
pause
GOTO END
:QUIT
echo:
echo ^[32mSortie sans sauvegarde[0m
echo:
pause
:END
Grace à tes propositions, j'ai pu adapter le script à mes besoins.
J'ai enlevé l'exclusion des json. J'ai choisi de faire une copie "effective" si Oui (j'en prends le risque car je fais une copie manuelle de la source autre part en cas de ratage du script)
Si j'ai bien compris, vu la copie ultrarapide quand je répond O, la commande ROBOCOPY (suivie de ses conditions) ne copiera que les fichiers ajoutés ou différents ??
On y est presque. Au "presque" je te vois réagir en te disant que, bon sang, on n'en aura jamais fini avec ce foutu "Script batch incorrect :(" -> :)
C'est idiot mais j'y tiens, quelles lignes dois-je ajouter avant :
* "echo ^[32mSynchronisation inutile[0m"
* "echo ^[32mSauvegarde effectuée le %date%[0m"
pour qu'il m'affiche :
Source.... = x xxx xxx xxx octets
Sauvegarde = x xxx xxx xxx octets
même si les tailles sont identiques ?
Ce serait 1 moyen rassurant pour moi de vérifier si orig et dest sont de même valeur à l'octet près...
Et peut on supprimer l'affichage de "Fichiers à copier:" qui subsiste mais ne me sert pas vraiment, puisque l'intégralité des fichiers est tenu en compte dans l'opération de copie ?
Si c'est pas top ça ??
Je comprends maintenant "ceintures et bretelles" comme tu dis, car en cas d'abandon de copie, il me répète les tailles, alors que c'est inutile. Par contre, le fait qu'il me les restitue après copie est TOP car il montre bien une équivalence, donc qu'il a fait le boulot...
Je suis obligé d'ajouter manuellement tous les "petits carrés" avant entre chaque ^ et [xm pour avoir la couleur, car quelque soit la langue choisie pour" l'insertion d'un extrait de code" sur ce site, il les zappe systématiquement. Donc, les "zoulies" couleurs que tu as pris l'initaitive d'incorporer sont + que "zoulies" pour moi, car très utiles pour la lecture et renforcent ainsi l'ergonomie de ce script. Merci
Très franchement, ce confort de 2.64ko de script, paramétrable à loisir, comparé aux nombreux softs de backup que j'ai pu tester.... Quand je veux faire un vrai backup complet de mon système, je fais 1 image disque avec Acronis, mais pas tous les 15j..
Tu as eu la patience de résoudre ce souci, et franchement, ça va + loin que je l'espérais, alors un grand MERCI.
@echo off
CHCP 65001 >NUL
SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
REM SET "orig=G:\photos\antibes"
REM SET "dest=C:\Users\brucine\Desktop\antibes"
echo ^[93mSAUVEGARDE THUNDERBIRD[0m
:AVANT
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
echo:
ECHO ^[34mTaille initiale:[0m
ECHO ^[34m----------------[0m
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
IF %diff% EQU 0 (
echo ^[32mDifférence = %diff1% octets[0m
) ELSE (
echo ^[31mDifférence = %diff1% octets[0m
)
GOTO CHOICE
:APRES
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
ECHO ^[34mTaille finale:[0m
ECHO ^[34m--------------[0m
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
IF %diff% EQU 0 (
echo ^[32mDifférence = %diff1% octets[0m
) ELSE (
echo ^[31mDifférence = %diff1% octets[0m
)
echo:
GOTO END
:CHOICE
echo:
CHOICE /C ON /M "Procéder à la sauvegarde?"
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO QUIT
:COPY
ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
CALL :APRES
pause
GOTO END
:QUIT
echo:
IF %diff% EQU 0 (
echo ^[32mDifférence nulle: Synchronisation inutile[0m
) ELSE (
echo ^[31mAttention! Sauvegarde abandonnée[0m
)
echo:
CALL :APRES
pause
:END
Moi, je suis comme les gendarmes, bête et discipliné, ou bien je n'ai pas bien compris.
Si tu ne veux pas de récapitulatif en cas d'abandon (volontaire ou pas de différence), tu vires la ligne 70.
J'ai commenté ici une manière artisanale d'obtenir le caractère d'échappement, je n'ai pas trouvé mieux pour le moment (sauf bien sûr une fois qu'on en a trouvé un de conserver sur son disque le script qui le contient).
https://forums.commentcamarche.net/forum/affich-37816788-batch-entrer-le-caractere-d-echappement-au-clavier
Si la ligne 70 est bien "CALL :APRES" de :QUIT et que je l'enlève, j'obtiens, en cas de réponse N :
Il ne passe pas directement à :QUIT quand il y a équivalence source/dest, et me répète malgrès tout les tailles source/dest...
Et en cas de réponse O :
il ne m'affiche plus les tailles source/dest...
Soit ma ligne 70 à supprimer n'est pas celle affichée dans le dernier script que j'ai posté, soit je n'ai pas compris.
Pour le carré au clavier, il est censé apparaître avec la combinaison Alt+9633, mais ça ne marche pas pour moi..
https://www.webnots.com/alt-code-shortcuts-for-square-symbols/
Les petits carrés, Niet; c'est comme le Canada Dry, ça ressemble mais ça n'en est pas, c'est juste un caractère qui n'est pas lisible dans le script et qui ressemble d'ailleurs à un rectangle.
Puisqu'on est dans CHOICE, les zolies couleurs et la défonce du consommateur, pas de raison que le choix ne soit pas coloré.
Supprime la ligne CHOICE en 48 et mets à la place sans oublier les caractères d'échappement:
ECHO [93mProcéder à la sauvegarde?[0m
Insère une nouvelle ligne au-dessous:
CHOICE /C ON
L'instruction CALL :APRES dans :QUIT commande d'aller exécuter ce qui se trouve dans l'étiquette :APRES (mesure des nouvelles tailles) et de revenir au point de départ après.
Le début du script zappe :APRES en allant à :CHOICE après :AVANT; si je supprime CALL :APRES dans :QUIT, il est donc impossible que la section :APRES soit lue autrement qu'à partir de :COPY, et c'est le comportement observé chez moi: tu as mal du enregistrer.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionVoici le script modifié tel que proposé
@echo off
CHCP 65001 >NUL
SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
REM SET "orig=G:\photos\antibes"
REM SET "dest=C:\Users\brucine\Desktop\antibes"
echo ^[93mSAUVEGARDE THUNDERBIRD[0m
:AVANT
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
echo:
ECHO ^[34mTaille initiale:[0m
ECHO ^[34m----------------[0m
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
IF %diff% EQU 0 (
echo ^[32mDifférence = %diff1% octets[0m
) ELSE (
echo ^[31mDifférence = %diff1% octets[0m
)
GOTO CHOICE
:APRES
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
ECHO ^[34mTaille finale:[0m
ECHO ^[34m--------------[0m
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
IF %diff% EQU 0 (
echo ^[32mDifférence = %diff1% octets[0m
) ELSE (
echo ^[31mDifférence = %diff1% octets[0m
)
echo:
GOTO END
ECHO ^[93mProcéder à la sauvegarde?[0m
CHOICE /C ON
echo:
CHOICE /C ON /M "Procéder à la sauvegarde?"
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO QUIT
:COPY
ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
CALL :APRES
pause
GOTO END
:QUIT
echo:
IF %diff% EQU 0 (
echo ^[32mDifférence nulle: Synchronisation inutile[0m
) ELSE (
echo ^[31mAttention! Sauvegarde abandonnée[0m
)
echo:
CALL :APRES
pause
:END
La fenetre s'ouvre, affiche la taille de la source, puis disparait....
Il me semble avoir respecté à la lettre les consignes....
Pourrais tu poster le script en intégralité avec les (bonnes) modifs stp ?
Le même qu'hier, que je viens encore de tester, et qui fonctionne dans les 4 cas de figure (abandon avec ou sans différence, sauvegarde avec ou sans différence) à cela près qu'il affiche la taille finale si on a l'idée curieuse de sauvegarder sans différence (Ne pas oublier d'intervertir les REM et les SET).
Si on veut parer à cette fausse manoeuvre, remplacer dans :COPY la ligne CALL :APRES par
IF %diff% NEQ 0 CALL: APRES
Si tu veux prendre en compte les différences de fichiers de configuration, je me suis fait aider dans une faute de syntaxe de l'exclusion du dossier datareporting (qui contient les lz4) que je ne trouvais pas, j'ai le batch correspondant à ta disposition.
@echo off
CHCP 65001 >NUL
REM SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
REM SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
SET "orig=G:\photos\antibes"
SET "dest=C:\Users\brucine\Desktop\antibes"
echo ^[93mSAUVEGARDE THUNDERBIRD[0m
:AVANT
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
echo:
ECHO ^[34mTaille initiale:[0m
ECHO ^[34m----------------[0m
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
IF %diff% EQU 0 (
echo ^[32mDifférence = %diff1% octets[0m
) ELSE (
echo ^[31mDifférence = %diff1% octets[0m
)
GOTO CHOICE
:APRES
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e
FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i
ECHO ^[34mTaille finale:[0m
ECHO ^[34m--------------[0m
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
IF %diff% EQU 0 (
echo ^[32mDifférence = %diff1% octets[0m
) ELSE (
echo ^[31mDifférence = %diff1% octets[0m
)
echo:
GOTO END
:CHOICE
echo:
ECHO [93mProcéder à la sauvegarde?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO QUIT
:COPY
ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
CALL :APRES
pause
GOTO END
:QUIT
echo:
IF %diff% EQU 0 (
echo ^[32mDifférence nulle: Synchronisation inutile[0m
) ELSE (
echo ^[31mAttention! Sauvegarde abandonnée[0m
)
echo:
pause
:END
Méga top ! Merci
Il me pose tjs la question si le souhaite "Procéder à la sauvegarde ?" alors qu'il y a égalité et qu'il devrait renvoyer à "Différence nulle: Synchronisation inutile", mais tout le reste fonctionne impeccable. Ne t'ennuie pas à corriger cette erreur car c'est vraiment un détail sans importance.
Pour le rectangle vertical, forme vide, de code Unicode « U+25AF » en raccourci clavier, je continue de fouiller car j'aimerais à mon tour pouvoir te dépanner, mais j'avoue que pour l'instant : bredouille... Je continue mes recherches.
Je devinais ce renvoi GOTO QUIT, mais ne savais comment l'intégrer, et ne savais pas qu'on pouvais seconder la commande avec un &... Merci.
J'ai débuté cette discussion avec 0 notions de batch, et ai fini grâce à tes explications, à comprendre quelques trucs.
Je ne pensais pas qu'un batch pouvait aller aussi loin en faisant en même temps appel à powershell. Les possibilités me paraissent presque infinies.
A nouveau 1 grand merci pour tout brucine. Il "tue" ce bash, comme dirait ma fille !!
PowerShell n'y a que 2 intérêts: contourner la limite de calcul 32 bits si ton dossier fait plus de 2 Go et permettre comme tu le souhaites d'afficher les tailles avec séparateurs de milliers: il est beaucoup plus complexe que Batch, mais beaucoup plus complet et permet dans le cas précis cet affichage en une seule ligne sans passer par une syntaxe Batch indigeste.
Sans ces exigences, on fait (hors fioritures de décoration) le job en Batch pur via Robocopy en moitié moins long.
Quand mes enfants étaient jeunes, dans mon patelin breton, il y avait à la sortie du bled un virage à angle droit qui faisait moultes victimes à la sortie des bistros, et qui depuis a été dévié par une rocade: les jeunes le désignaient comme "le virage de la mort qui tue".
Sur un plan plus général, les puristes objecteront que les scripts mixtes ne sont pas une bonne pratique, ils ont raison quand on peut l'éviter.
On peut tout écrire en PowerShell mais j'y suis moins à l'aise, je trouve que le "volet décoratif" (couleurs...) y est moins agréable (ça ne se mange pas en salade...) et surtout PowerShell pèche pour la copie incrémentielle comparée à ROBOCOPY qui permet de l'écrire en une ligne simple.
Chacun sait que rien n'est autant indispensable que ce qui est inutile.
Il est à peu près exclu de rédiger la chose en "batch pur" via ROBOCOPY parce que la sortie a non seulement un format rebutant mais l'idée tordue de les transcrire en multiples d'octets; là où un script tarabiscoté aurait permis d'obtenir en batch la séparation des milliers à partir des octets, là, on a les yeux pour pleurer:
Il y a toutefois une alternative avec XXCOPY, qui est un clone de ROBOCOPY permettant d'ailleurs en d'autres cas que celui qui nous intéresse davantage de fantaisies, et qui nous donne la sortie en octets avec séparation des milliers.
ça se télécharge là, par le passé il suffisait de copier l'exécutable XXCOPY.EXE sous C:\Windows\System32, je ne suis pas sûr qu'avec les moins vieilles il ne faille pas passer par l'install.bat, qui instaure en plus quelques goodies: une console Dos personnalisée dont rien n'oblige à se servir, et une barre de menus à ne pas utiliser.
https://www.majorgeeks.com/mg/getmirror/xxcopy,1.html
Le résultat permet de gérer facilement l'exclusion du fameux dossier jsonlz4 (dossier datareporting du Profil) via la syntaxe /Xdatareporting\ (l'absence d'espace après le X n'est pas un typo), et qu'on enlève si on n'en veut pas.
Copies d'écran sans différence, et avec copie abandonnée ou pas plus script.
@echo off
set i=0
set j=0
REM SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
REM SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
SET "orig=G:\photos\antibes"
SET "dest=C:\Users\brucine\Desktop\antibes"
echo:
ECHO ^[104;93mSAUVEGARDE THUNDERBIRD[0m
echo:
:SIZEDEBUT
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %dest% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %orig% %dest% /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
FOR /F "skip=1 tokens=1-2 delims==" %%a IN ('type "_debut.txt"') DO SET titreD=%%a & SET sizeD=%%b & CALL :PROCESSD
CHCP 65001 >NUL
ECHO ^[104mTaille initiale (sans fichiers de configuration):[0m
echo Source = %sizeorigD% octets
echo Sauvegarde = %sizedestD% octets
set diff1D=%diffD:~1%
set diff2D=%diff1D:~0,1%
IF %diff2D% LSS 1 (
echo ^[103;92mDifférence = %diffD% octets[0m & GOTO NOCOPY
) ELSE (
echo ^[103;91mDifférence = %diffD% octets[0m & GOTO CHOICE
echo:
:PROCESSD
set /a i=%i%+1
IF %i% EQU 2 SET sizeorigD=%sizeD%
IF %i% EQU 9 SET sizedestD=%sizeD%
IF %i% EQU 16 SET diffD=%sizeD%
exit /b
:CHOICE
echo:
ECHO [93mProcéder à la sauvegarde?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO QUIT
:NOCOPY
echo:
echo ^[103;92mDifférence nulle: Synchronisation inutile[0m
echo:
GOTO END
:QUIT
echo:
echo ^[103;91mAttention,Synchronisation Abandonnée









Ce n'est pas un bon plan puisque du fait des fichiers de configuration la différence à chaque ouverture de Thunderbird ne sera jamais nulle et que du fait de l'absence de leur liste tu n'auras aucun moyen de voir à quoi correspond cette différence, mais c'est toi qui vois.
ROBOCOPY synchronise: les fichiers nouveaux ou modifiés dans la source s'ajoutent dans ceux de destination ou les écrasent; les fichiers qui existent dans la destination mais plus dans la source sont supprimés de la destination.
Le contenu des 2 dossiers à l'issue de l'opération est donc forcément identique.
Sur le plan de la forme, tu as à nouveau zappé mes zolies couleurs, je ne sais pas si c'est fait exprès puisqu'il reste des reliquats de leur syntaxe; je les ai rétablies et j'en ai même rajouté rien que pour t'embêter, libre à toi de les enlever.
J'ai ajouté mes 2 lignes SET pour tester, tu les supprimes et tu enlèves le REM devant les tiennes.
Donc ta version "ceinture et bretelles" bien que ROBOCOPY la rende inutile et que le teste de taille sans prendre en compte les fichiers de configuration ne sert à rien:
@echo off CHCP 65001 >NUL REM SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release" REM SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release" SET "orig=G:\photos\antibes" SET "dest=C:\Users\brucine\Desktop\antibes" echo ^[93mSAUVEGARDE THUNDERBIRD[0m :AVANT FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i echo: ECHO ^[34mTaille initiale:[0m ECHO ^[34m----------------[0m FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets IF %diff% EQU 0 ( echo ^[32mDifférence = %diff1% octets[0m ) ELSE ( echo ^[31mDifférence = %diff1% octets[0m ) GOTO CHOICE :APRES FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum"') DO SET td=%%b FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i ECHO ^[34mTaille finale:[0m ECHO ^[34m--------------[0m FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse | Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets IF %diff% EQU 0 ( echo ^[32mDifférence = %diff1% octets[0m ) ELSE ( echo ^[31mDifférence = %diff1% octets[0m ) echo: GOTO END :CHOICE echo: CHOICE /C ON /M "Procéder à la sauvegarde?" IF %ERRORLEVEL% EQU 1 GOTO COPY IF %ERRORLEVEL% EQU 2 GOTO QUIT :COPY ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS echo ^[32mSauvegarde effectuée le %date%[0m echo: CALL :APRES pause GOTO END :QUIT echo: IF %diff% EQU 0 ( echo ^[32mDifférence nulle: Synchronisation inutile[0m ) ELSE ( echo ^[31mAttention! Sauvegarde abandonnée[0m ) echo: CALL :APRES pause :END