Script batch incorrect :(

Fermé
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 - 11 mars 2023 à 15:38
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 - 28 avril 2023 à 09:45

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..

A voir également:

101 réponses

bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
23 mars 2023 à 12:02

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 ?

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
23 mars 2023 à 14:49

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


0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
23 mars 2023 à 16:53

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


0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
23 mars 2023 à 17:03

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

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
23 mars 2023 à 16:58

Seul bug, mais ça ne me gêne franchement pas

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
23 mars 2023 à 17:05

Je t'ai répondu ci-dessus.

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
23 mars 2023 à 18:08

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/

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
23 mars 2023 à 18:36

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.

0

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

Posez votre question
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
23 mars 2023 à 22:42

Voici 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....

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
23 mars 2023 à 22:45

Il me semble avoir respecté à la lettre les consignes....

Pourrais tu poster le script en intégralité avec les (bonnes) modifs stp ?

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
24 mars 2023 à 08:03

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



 

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
24 mars 2023 à 10:03

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.

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
24 mars 2023 à 10:10

Remplace la ligne 24 par:
 

echo ^[32mDifférence = %diff1% octets[0m & GOTO QUIT
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
24 mars 2023 à 10:34

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 !!

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
24 mars 2023 à 10:58

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".

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805 > brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025
24 mars 2023 à 11:35

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.

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805 > brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025
26 mars 2023 à 15:37

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![0m
echo:
GOTO END

:SIZEFIN
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %dest% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %orig% %dest% /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
FOR /F "skip=1 tokens=1-2 delims==" %%c IN ('type "_fin.txt"') DO SET titreF=%%c & SET sizeF=%%d & CALL :PROCESSF

CHCP 65001 >NUL
ECHO ^[104mTaille finale (sans fichiers de configuration):[0m
echo Source     = %sizeorigF% octets
echo Sauvegarde = %sizedestF% octets
echo ^[103;92mDifférence = %diffF% octets[0m
echo:
GOTO END

:PROCESSF
set /a j=%j%+1
IF %j% EQU 2 SET sizeorigF=%sizeF%
IF %j% EQU 9 SET sizedestF=%sizeF%
IF %j% EQU 16 SET diffF=%sizeF%
exit /b

:COPY
XXCOPY %orig% %dest% /Xdatareporting\ /Q3 /CBQ /CLONE /YY >NUL
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
GOTO SIZEFIN

:END
pause
del _debut.txt
del _fin.txt
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
27 mars 2023 à 14:18

Merci brucine pour ce nouveau script.

Chez moi, la fenêtre s'ouvre et se ferme sans que j'ai pu tester la chose... Je ne cois pas que ce soit le ^ qui manque ligne 42 qui me cause ce souci...

Au début, j'avais tenté un version xcopie avec un compte rendu MsgBox qui marchait pas mal. Ca m'écrasait intégralement le dossier de sauvegarde (ce qui ne me dérangeait pas). Par contre je n'avais pas le choix de sauvegarder ou non. Je voulais aussi que ça me crée un fichier texte dans D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\ qui soit nommé en date et heure de la sauvegarde, mais je n'y suis pas arrivé...

rem ###################################
rem ### Effacement ancien dossier CIBLE ###
rem ##################################
rmdir /S /Q D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release

rem ##################################
rem ### Création nouveau dossier CIBLE ###
rem #################################
mkdir D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release

rem ########################################
rem ### Copie du dossier SOURCE vers CIBLE  ###
rem #######################################
xcopy C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release /E /C /H

@echo off
echo ---------------------------------------------------
echo  --------------- OPERATION TERMINEE ---------------
echo ---------------------------------------------------

rem ######################################################################
rem ### Affichage Taille dossiers avec séparateurs de milliers dans fenêtre Windows ###
rem #####################################################################
@echo off

set "source=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
set "target=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
set "size1=0"
set "size2=0"

for /f "tokens=3" %%i in ('dir /s /a /-c "%source%" ^| findstr /i "fichier(s)"') do set size1=%%i
for /f "tokens=3" %%i in ('dir /s /a /-c "%target%" ^| findstr /i "fichier(s)"') do set size2=%%i

setlocal EnableDelayedExpansion
set "formatted_size1=!size1!"
set "formatted_size2=!size2!"

rem Ajouter des séparateurs de milliers
for /f "tokens=1-2 delims=." %%a in ("!formatted_size1!.") do set "formatted_size1=%%a" & set "decimal_part=%%b"
set "formatted_size1=!formatted_size1:,=!"
set "formatted_size1=!formatted_size1!.!decimal_part!"

for /f "tokens=1-2 delims=." %%a in ("!formatted_size2!.") do set "formatted_size2=%%a" & set "decimal_part=%%b"
set "formatted_size2=!formatted_size2:,=!"
set "formatted_size2=!formatted_size2!.!decimal_part!"

echo MsgBox "Taille source (C:) : " ^& FormatNumber(!formatted_size1!, 0, True) ^& " octets" ^& vbCrLf ^& "Taille cible (D:) :    " ^& FormatNumber(!formatted_size2!, 0, True) ^& " octets", vbOKOnly, "Resultat du backup" > %temp%\temp.vbs

start /wait %temp%\temp.vbs
del %temp%\temp.vbs
exit
0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
27 mars 2023 à 16:58

En effet, j'ai oublié l'accent circonflexe ligne 42, mais ça marche sans, preuve par l'image dans les captures en <97>.

Le batch en <97> ne fonctionne pas avec XCOPY, il faut un utilitaire de sauvegarde incrémentielle, précédemment ROBOCOPY, maintenant XXCOPY (voir notamment syntaxe lignes 16 à 18) dont lien de téléchargement également en <97>.

La dernière version sur ce lien est 3.3, CCM propose 2.9, Internet Archive 2.25.

Cette dernière est certainement suffisante pour notre propos et sans gadget (on copie XXCOPY.EXE sous
C:\Windows\System32 et c'est tout), les dernières versions n'amènent rien en ce qui nous intéresse (sinon une limitation réseau dans la version gratuite).

Le lien direct vers l'éditeur est mort parce que l'entreprise l'est (et l'auteur aussi).

https://www.majorgeeks.com/mg/getmirror/xxcopy,1.html

https://www.commentcamarche.net/telecharger/utilitaires/24579-xxcopy/

https://archive.org/details/xcpy2259_zip

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
27 mars 2023 à 20:18

xxcopy est surement pas mal, mais son installation via l'exe refroidit un peu. Après une multitude de confirmations à faire, et des avertissement de limitations a 60 jours, une histoire de 1 euro, etc, il s'installe enfin. Ensuite, quand le batch est lancé, on répond ok à 3 demandes de confirmation du contrôle de compte utilisateur, puis la fenêtre ms-dos se ferme.

J'ai tenté ensuite via le install.bat pour x64, mais le résultat est le même... Comme je n'ai pas survéillé son install avec revo inustaller pro (que j'utilise à chaque nouvelle installation) je ne peux plus le désinstaller, donc je ferai avec, en espérant  que ce mini utilitaire de pixelab ne bouscule pas trop mon système...

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
27 mars 2023 à 20:52

Je me sers de différentes versions depuis des lustres, toute la comédie de l'installation par le bat ne fait rien d'autre que de nous saouler de baratin pour finir par installer seulement quelques fichiers commençant par XXCOPY sous System32 (le nombre dépend de la version, 5 au maximum), sans rien d'autre (service, dll...).

Pour désinstaller, on supprime ces fichiers, fin des courses.

C'est pourquoi (je ne sais plus si les versions 2.9 et 3.3 le permettent, la version 2.25 c'est sûr), il est plus simple de ne pas passer par le bat et de se contenter de copier XXCOPY.EXE à la main dans System32: l'EXE n'est PAS un programme d'installation, mais l'utilitaire à part entière; si on clique dessus, rien ne se passe puisqu'il n'obéit (comme XCOPY) qu'à la ligne de commande, et l'UAC (si elle est activée) braille comme à chaque fois qu'on lance un EXE inconnu.

Il s'agissait à l'origine d'un utilitaire de sauvegarde destiné aux entreprises à l'appui de la commercialisation d'un système de sauvegarde matériel spécifique: il est logique que l'auteur ait cherché à vendre sa soupe en monnayant l'utilisation réseau (dans les dernières versions) et celle sur plusieurs postes, mais il est gratuit dans le cadre de l'utilisation individuelle.

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
28 mars 2023 à 15:05

XXCOPY.exe dans System32 sans install, ok. Résultat nickel en lançant le bat en admin.

L'opération de copie dure aussi longtemps qu'avec xcopy, mais ça marche impeccable. Merci.

Y aurait il un moyen pour que le bat crée un fichier texte dans D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\ , un *.txt qui soit nommé en date et heure de la sauvegarde, par ex 230328-15h00.txt si je fais la sauvegarde maintenant ?

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
28 mars 2023 à 15:21

J'ai pensé à une ligne de type

D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird type nul > %date%-%time%.txt

mais ça ne marche pas..

0
jee pee Messages postés 40717 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 janvier 2025 9 505
28 mars 2023 à 15:33
echo >LOG_%date:~8,2%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
28 mars 2023 à 16:12

Yes ! Merci jee pee !

Et si je veux que ce fichier soit créé dans le dossier D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\, dois-je faire précéder cette echo par un cd...... ou autre ?

0
jee pee Messages postés 40717 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 janvier 2025 9 505
Modifié le 28 mars 2023 à 16:16
echo >D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\LOG_%date:~8,2%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
28 mars 2023 à 16:41

Top ! Merci !

Franchement, ce script va au delà de mes espérances. Du coup je fais mes sauvegardes 4 fois par jour... juste pour le plaisir !

Je le poste ici en intégralité, pour ceux que le fruit de votre travail collectif intéresserait

@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:
echo ^[07mSAUVEGARDE 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 ^[08mTaille rdwdst72.default-release:[0m
ECHO ^[08m--------------------------------[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 Différence =               ^[32m%diff1% octets[0m & GOTO QUIT
) ELSE (
 echo Différence =       ^[31m%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 ^[08mLancer la sauvegarde?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO QUIT

:COPY
echo ^[31mSAUVEGARDE EN COURS....[0m
ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS
echo ^[32mSauvegarde mise a jour dans txt[0m
echo >D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\Derniere_SVG_le_%date:~8,2%%date:~3,2%%date:~0,2%-%time:~0,2%h%time:~3,2%.txt
echo:
CALL :APRES
pause
GOTO END

:QUIT
echo:
IF %diff% EQU 0 (
 echo ^[32mDifférence nulle: Synchronisation inutile[0m
) ELSE (
 echo ^[32mSauvegarde abandonnée[0m
)
echo:
pause

:END

Grand merci à brucine pour sa patience, et à jee pee pour sa participation !

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
29 mars 2023 à 13:11

Bonjour,

Il faut donc en plus des bretelles et de la ceinture un 3ème accessoire: l'affichage "sauvegarde le..." n'a lieu qu'après la commande effective de copie, verrouillée par l'affichage des tailles avant et après, sans compter que la date de dernière modification peut s'obtenir dans l'item propriétés du dossier de destination.

S'il faut des fichiers de log, je trouve plus intéressant de les mettre à la racine du dossier de sauvegarde que dans le dossier lui-même, c'est plus facile à retrouver, en français que le chemin soit plutôt:

D:\bibi\Pro\Documents\Sauvegardes_pro\

mais c'est toi qui vois.

J'ai peut-être encore mieux, donner au dossier le nom de la date d'exécution, plus besoin de fichier de log.

Comme suit, je l'ai fait dans la version XXCOPY parce que c'est celle que j'avais sous la main, le contexte est le même via ROBOCOPY/PowerShell:


 

@echo off
set i=0
set j=0

set time1=%time:~0,2%
set time2=%time:~3,2%
set date1=%date:~0,2%
set date2=%date:~3,2%
set date3=%date:~6,4%

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"
IF NOT EXIST "%dest%\**_**h**" GOTO VIERGE
SET "destfin=%date1%%date2%%date3%_%time1%h%time2%"
FOR /F %%p IN ('DIR /B "%dest%\**_**h**"') DO SET destinit=%%p
GOTO SIZEDEBUT

:VIERGE
SET destinit="%date1%%date2%%date3%_%time1%h%time2%"
MD %dest%\%destinit%

:SIZEDEBUT
echo:
ECHO ^[104;93mSAUVEGARDE THUNDERBIRD[0m
echo:
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %destinit% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %orig% %destinit% /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 = %sizedestinitD% 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 sizedestinitD=%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![0m
echo:
FOR /F %%u IN ('dir /b /a "%destinit%\*"') DO (
    GOTO END
)
RD /S /Q %destinit%
GOTO END

:SIZEFIN
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %destinit% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %orig% %destinit% /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
FOR /F "skip=1 tokens=1-2 delims==" %%c IN ('type "_fin.txt"') DO SET titreF=%%c & SET sizeF=%%d & CALL :PROCESSF

MOVE %destinit% %destfin% >NUL
CHCP 65001 >NUL
ECHO ^[104mTaille finale (sans fichiers de configuration):[0m
echo Source     = %sizeorigF% octets
echo Sauvegarde = %sizedestfinF% octets
echo ^[103;92mDifférence = %diffF% octets[0m
echo:
GOTO END

:PROCESSF
set /a j=%j%+1
IF %j% EQU 2 SET sizeorigF=%sizeF%
IF %j% EQU 9 SET sizedestfinF=%sizeF%
IF %j% EQU 16 SET diffF=%sizeF%
exit /b

:COPY
XXCOPY %orig% %destinit% /Xdatareporting\ /Q3 /CBQ /CLONE /YY >NUL
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
GOTO SIZEFIN


:END
pause
del _debut.txt
del _fin.txt
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
29 mars 2023 à 20:39

Eh eh .. Si bretelles et ceinture sont insuffisants, on pourrait appeler ça un baudrier... :)

Super ce dossier dans rdwdst72.default-release. C'est bien que ça ne bouscule pas le nom "rdwdst72.default-release" du dossier, car en cas de crash de thunderbird, je copie le dossier sauvagardé à son ancien emplacement sur C:, et tout roule comme avant. Ce dossier suppl ne gênera en rien thunderbird. Je seul souci, c'est qu'il ne retrouve plus ses petits après une sauvegarde, il m'indique:

SAUVEGARDE THUNDERBIRD

Taille initiale (sans fichiers de configuration):
Source     =  9 074 500 706  octets
Sauvegarde =  0  octets
Différence =  9 074 500 706  octets

alors que je viens de faire une sauvegarde juste avant, avec le même script, et sans lancer thunderbird entre temps.

Curieux ...

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
29 mars 2023 à 21:08

J'ai testé dans tous les cas de figure (absence ou présence initiale d'un dossier de sauvegarde, différence ou pas dans les dossiers, abandon ou pas), ça fonctionne dans tous les cas.

Si l'affichage de la sauvegarde est à 0, il faut commencer par se demander si c'est vrai ou pas (comparer physiquement la taille de la source et de la destination); si ça ne l'est pas, c'est qu'il y a une erreur dans la ligne

echo Sauvegarde = %sizedestfinF% octets

soit de définition de la variable, soit de son calcul SIZEFIN + PROCESSF; on peut aussi s'en assurer  en ne confirmant pas le pause dans END, permettant de lire le fichier fin.txt avant son effacement.

Noter aussi que la manipulation oblige à définir différemment le chemin de la destination (lignes 14 et 17) et que j'ai donc modifié les variables suivantes y faisant référence en conséquence.

Je suppose que tu ne t'es pas contenté de recopier le script en changeant source et destination lignes 13 et 14 mais que tu l'as intégré à ta propre sauce qu'il faudrait que tu montres pour trouver le bug.

Le script en question crée un dossier de sauvegarde à date, c'est le but, le dernier que j'ai testé dans la journée s'appelle 29032023_12h57 et ne se prête donc pas à être restauré en l'état.

Pour ce faire, il faut au plus simple avoir dans un fichier texte le nom réel du dossier et renommer en fonction avant restauration.

On peut aussi peaufiner en décidant que

(destinit et) destfin valent rdwdst72.default-release-%date1%%date2%%date3%_%time1%h%time2%

En cas de restauration, je renomme en effaçant tout ce qu'il y a derrière release.

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
29 mars 2023 à 20:42

et aussi qu'il me dépose un "_debut.txt" vide sur mon bureau après exécution, car je lance ce batch sur mon bureau

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
30 mars 2023 à 20:21

Voici le script complet

@echo off
set i=0
set j=0

set time1=%time:~0,2%
set time2=%time:~3,2%
set date1=%date:~0,2%
set date2=%date:~3,2%
set date3=%date:~6,4%

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"
IF NOT EXIST "%dest%\**_**h**" GOTO VIERGE
SET "destfin=%date1%%date2%%date3%_%time1%h%time2%"
FOR /F %%p IN ('DIR /B "%dest%\**_**h**"') DO SET destinit=%%p
GOTO SIZEDEBUT

:VIERGE
SET destinit="%date1%%date2%%date3%_%time1%h%time2%"
MD %dest%\%destinit%

:SIZEDEBUT
echo:
ECHO ^[104;93mSAUVEGARDE THUNDERBIRD[0m
echo:
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %destinit% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %orig% %destinit% /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 = %sizedestfinF% 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 sizedestinitD=%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![0m
echo:
FOR /F %%u IN ('dir /b /a "%destinit%\*"') DO (
    GOTO END
)
RD /S /Q %destinit%
GOTO END

:SIZEFIN
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %destinit% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %orig% %destinit% /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
FOR /F "skip=1 tokens=1-2 delims==" %%c IN ('type "_fin.txt"') DO SET titreF=%%c & SET sizeF=%%d & CALL :PROCESSF

MOVE %destinit% %destfin% >NUL
CHCP 65001 >NUL
ECHO ^[104mTaille finale (sans fichiers de configuration):[0m
echo Source     = %sizeorigF% octets
echo Sauvegarde = %sizedestfinF% octets
echo ^[103;92mDifférence = %diffF% octets[0m
echo:
GOTO END

:PROCESSF
set /a j=%j%+1
IF %j% EQU 2 SET sizeorigF=%sizeF%
IF %j% EQU 9 SET sizedestfinF=%sizeF%
IF %j% EQU 16 SET diffF=%sizeF%
exit /b

:COPY
XXCOPY %orig% %destinit% /Xdatareporting\ /Q3 /CBQ /CLONE /YY >NUL
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
GOTO SIZEFIN


:END
pause
del _debut.txt
del _fin.txt

Voici le script complet

J'y ai modifié la ligne Sauvegarde = %sizedestfinF% octets, et cette fois il m'affiche :

Source     =  9 074 500 706  octets
Sauvegarde =  octets
Différence =  9 074 500 706  octets

l'aurais-je mal adapté ? ce qui est très possible...

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
30 mars 2023 à 23:37

Je crois que tu t'es planté dans la définition de la variable dest en début de fichier, j'avais attiré ton attention sur le fait que le chemin était différent si l'on veut nommer les dossiers en fonction de la date.

Mais ce soir, j'ai une migraine noire, j'éplucherai et testerai ça demain et je te retournerai le feedback.

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
31 mars 2023 à 10:02

Le dest m'envoie bien vers "rdwdst72.default-release" et non aux Antibes. C'est bien dommage car je ne connais pas ce coin de la planête, et par les temps qui courent, je crois que ça me ferait vraiment du bien..eh eh.

C'est peut être le saut GOTO VIERGE dans le cas ou le rep date/heure existe ?.. mais il ne fait qu'enjamber la création de ce dossier en cas d'existence, et ne modifie en rien le diff....J'avoue être un peu perdu.

Je t'espère en meilleure forme qu'hier soir. Ne te casse pas trop la tête pour ce script, car celui de la Réponse 54 / 57 fait déjà le taf bien au delà de mes souhaits. Un petit txt à coté de rdwdst72.default-release me montre du premier coup d'oeil que le boulot a été fait. Je vais essayer ce weekend d'en créer un autre sur cette base pour qu'il me copie mon carnet d'adresses, + rapidement qu'un export en csv depuis thunderbird, et qu'il me copie mon dernier Bookmark FIREFOX. Je fais chaque fois ce "copies" de sauvegarde manuellement, et maintenant que j'ai ce modèle, ça me tente bien de l'adapter..

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
31 mars 2023 à 16:19

Dans le papotage:
-Firefox, tu te casses le train pour rien:
Tu tapes about:config, tu confirmes, tu tapes "book" et à la ligne browser.bookmarks.autoExportHTML, à droite, tu changes avec les flèches de "False" à "True".
Tu as ainsi en permanence tes marque-pages à jour au format bookmarks.html, plus qu'à faire une sauvegarde externe du fichier au cas où (ou une copie externe de tout le profil Firefox).


-Ce n'est pas outre-mer aux Antibes, mais dans les Alpes-Maritimes, j'y ai vécu enfant:
 

Je m'en suis servi de dossier cobaye, c'est pratique, il n'y a juste que quelques photos, mais revenons à nos moutons.

Tu m'as fait transpirer parce que tu as modifié des variables et des chemins à la hussarde, pour trouver le bug...
Cela dit, j'ai ma part de responsabilité parce que la syntaxe d'effacement du dossier de sauvegarde pour première sauvegarde avortée à l'étiquette QUIT était foireuse et parce que je n'avais pas pensé aux oiseaux de nuit.

Le format **_**h** par exemple ligne 38 était destiné à sécurisé les sauvegardes en ne traitant que les dossiers dont le nom contenait jjmmaaaa_(hh)h(mm), rendant improbable qu'il s'agisse d'un autre dossier; j'avais juste oublié que quand (hh) ne comportait qu'un chiffre (1h52, 9h48) on se faisait planter.

J'ai eu pitié de toi, j'ai viré les rues d'Antibes et j'ai créé un dossier bidon Thunderbird à sa place normale, mais si j'ai une palanquée de partitions, je n'en ai aucune en D:\, tu dois donc te contenter de remplacer par D:\ ce qui est écrit E:\.

Le résultat te sort un dossier de sauvegarde nommé à la date de dernière modification (par exemple 31032023_15h39) se trouvant sous le dossier Mails_thunderbird.

J'en ai même rajouté une couche en cas de plantage: le deuxième script annexé va chercher le nom du profil Thunderbird (y compris un nouveau si on a du désinstaller et réinstaller) et renomme le dossier 31032023_15h39 par exemple rdwdst72.default-release, plus qu'à le couper-coller à sa place (on ne peut pas faire de script simple pour ça, on se fait jeter parce que la destination est dans les dossiers Users).

Script de synchronisation:

 

@echo off
set i=0
set j=0

echo %time% > time.txt
FOR /F %%q IN ('type "time.txt"') DO SET heure=%%q
set time1=%heure:~0,2%
IF %time1% LSS 10 (
 GOTO AM
 ) ELSE (
 GOTO TIME
)
:AM
set time1=%time:~0,1%
set time1=%i%%time%
GOTO TIME

:TIME
del time.txt
set time2=%time:~3,2%
set date1=%date:~0,2%
set date2=%date:~3,2%
set date3=%date:~6,4%

DIR /B %Appdata%\Thunderbird\Profiles\ >> thunder.txt
FOR /F %%v IN ('type "thunder.txt"') DO SET titre1=%%v & CALL :PROCESST
GOTO DOSSIERS

:PROCESST
SET titre2=%titre1:~-8%
IF %titre2%==release SET titre=%titre1%
SET titre=%titre: =%
SET "orig=%AppData%\Thunderbird\Profiles\%titre%"
exit /b

:DOSSIERS
SET "dest=E:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird"
IF NOT EXIST "%dest%\**_**h**" GOTO VIERGE
SET "destfin=%date1%%date2%%date3%_%time1%h%time2%"
FOR /F %%p IN ('DIR /B "%dest%\**_**h**"') DO SET destinit=%%p
GOTO SIZEDEBUT

:VIERGE
SET destinit=%date1%%date2%%date3%_%time1%h%time2%
MD %dest%\%destinit%

:SIZEDEBUT
echo:
ECHO ^[104;93mSAUVEGARDE THUNDERBIRD[0m
echo:
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %dest%\%destinit% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %orig% %dest%\%destinit% /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 = %sizedestinitD% 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 sizedestinitD=%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![0m
DIR /b /s /a "%dest%\%destinit%" | findstr .>nul || (
  RD /S /Q %dest%\%destinit%
)
GOTO END

:SIZEFIN
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %dest%\%destinit% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %orig% %dest%\%destinit% /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
FOR /F "skip=1 tokens=1-2 delims==" %%c IN ('type "_fin.txt"') DO SET titreF=%%c & SET sizeF=%%d & CALL :PROCESSF

MOVE %dest%\%destinit% %dest%\%destfin% >NUL
CHCP 65001 >NUL
ECHO ^[104mTaille finale (sans fichiers de configuration):[0m
echo Source     = %sizeorigF% octets
echo Sauvegarde = %sizedestfinF% octets
echo ^[103;92mDifférence = %diffF% octets[0m
echo:
GOTO END

:PROCESSF
set /a j=%j%+1
IF %j% EQU 2 SET sizeorigF=%sizeF%
IF %j% EQU 9 SET sizedestfinF=%sizeF%
IF %j% EQU 16 SET diffF=%sizeF%
exit /b

:COPY
echo:
echo ^[93mPatientez,Sauvegarde en cours...%[0m
XXCOPY %orig% %dest%\%destinit% /Xdatareporting\ /Q3 /CBQ /CLONE /YY >NUL
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
GOTO SIZEFIN

:END
pause
del thunder.txt
del _debut.txt
del _fin.txt

Script de restauration:

@echo off

SET save=E:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\
SET profil=%Appdata%\Thunderbird\Profiles\

:PROFIL
DIR /B %profil% >> profil.txt
FOR /F %%a IN ('type "profil.txt"') DO SET nom_profil1=%%a & CALL :PROCESSPROFIL
GOTO SAVE

:PROCESSPROFIL
SET nom_profil2=%nom_profil1:~-8%
IF %nom_profil2%==release SET nom_profil=%nom_profil1%
exit /b

:SAVE
DIR /B %save% >> nom_save.txt
FOR /F %%b IN ('type "nom_save.txt"') DO SET nom_save=%%b

:RESTORE
MOVE %save%%nom_save% %save%%nom_profil%

:END
del profil.txt
del nom_save.txt
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
1 avril 2023 à 01:24

Magnifique ce coin !.... comme quoi nul besoin d'aller au bout du monde pour découvrir des coins vraiment sympas..
Effectivement, pour firefox, je me contecterai de copier le dossier C:\Users\bibi\AppData\Roaming\Mozilla\Firefox\Profiles\cghf72ys.default-release-1679336511497\bookmarkbackups qui ne contient qu'une quinzaine des derniers backups de firefox (600ko par fichier, c'est pas émorme)

Je devine un peu avoir mis le bazar dans le script, désolé. Par contre je n'y ai pas vu "d'oiseaux de nuit"...

Pour ce script, je me suis uniquement contenté de faire comme indiqué, de façon bête et disciplinée, remplacer
SET "dest=E:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird"  par
SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird"

et surtout pas touché à
SET "orig=%AppData%\Thunderbird\Profiles\%titre%"
puisque tu as créé, et merci encore, un dossier Thunderbird factice sur ton ordi

Résultat, vais-je l'avouer...,

J'ai ensuite lu et relu les recommandations, tout vérifié, recommencé mais même résultat.

J'ai ensuite tenté de modifier tout adressage orig et dest par :

orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release
dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release

mais le résultat était pire, ...

A défaut de piètre copieur, je fais un bien piètre analyste....

0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
1 avril 2023 à 01:25

Quelle déception de ne pouvoir tester le script de restauration..

0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805
1 avril 2023 à 07:40

Le script de restauration, il ne fait pas tout le job parce que, comme expliqué, il faudrait qu'il s'attribue des privilèges sur le dossier Users que Windows lui refuse; si j'y pense, je chercherai un subterfuge, mais c'est compliqué à écrire.

Il se contente de renommer le dossier de sauvegarde 01042023_07h24 en rdwdst72.default-release ce qui permet en cas de restauration de le copier-coller directement à sa place avec la souris sans avoir à le renommer à la main.

Ou au cours de tests vice-versa si j'inverse les 2 variables suivantes pour renommer rdwdst72.default-release à la date courante:

MOVE %save%%nom_save% %save%%nom_profil%

Tu peux donc parfaitement tester.

Un oiseau de nuit, en ce qui nous intéresse, c'est quelqu'un qui fait le job entre 0h00 et 9h59, et ce n'est que rarement mon cas pour tester parce que j'ai une vie sociale et/ou un lit; vérification faite (nous sommes dans le créneau), pendant ce laps de temps, l'heure n'a qu'un chiffre dans le format d'origine 7:34 et sort 7: au lieu de 07 (et 21 s'il est 21h34, 2 chiffres) ce qui évidemment plante le script.

Correction faite sur cette période (sans rien changer à l'autre), garder en l'état sauf la lettre de destination, changer E: en D:
 

@echo off
set i=0
set j=0

echo %time% > time.txt
FOR /F %%q IN ('type "time.txt"') DO SET heure=%%q
set time1=%heure:~0,2%
set time11=%heure:~0,1%
set time12=%heure:~1,1%
IF %time12%==: (
 GOTO AM
 ) ELSE (
 GOTO TIME
)
:AM
set time1=%i%%time11%
GOTO TIME

:TIME
del time.txt
set time2=%time:~3,2%
set date1=%date:~0,2%
set date2=%date:~3,2%
set date3=%date:~6,4%

DIR /B %Appdata%\Thunderbird\Profiles\ >> thunder.txt
FOR /F %%v IN ('type "thunder.txt"') DO SET titre1=%%v & CALL :PROCESST
GOTO DOSSIERS

:PROCESST
SET titre2=%titre1:~-8%
IF %titre2%==release SET titre=%titre1%
SET titre=%titre: =%
SET "orig=%AppData%\Thunderbird\Profiles\%titre%"
exit /b

:DOSSIERS
SET "dest=E:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird"
IF NOT EXIST "%dest%\**_**h**" GOTO VIERGE
SET "destfin=%date1%%date2%%date3%_%time1%h%time2%"
FOR /F %%p IN ('DIR /B "%dest%\**_**h**"') DO SET destinit=%%p
GOTO SIZEDEBUT

:VIERGE
SET destinit=%date1%%date2%%date3%_%time1%h%time2%
MD %dest%\%destinit%

:SIZEDEBUT
echo:
ECHO ^[104;93mSAUVEGARDE THUNDERBIRD[0m
echo:
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %dest%\%destinit% C:\_TEMPD /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _debut.txt
XXCOPY %orig% %dest%\%destinit% /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 = %sizedestinitD% 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 sizedestinitD=%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![0m
DIR /b /s /a "%dest%\%destinit%" | findstr .>nul || (
  RD /S /Q %dest%\%destinit%
)
GOTO END

:SIZEFIN
CHCP 1252 >NUL
XXCOPY %orig% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %dest%\%destinit% C:\_TEMPF /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
XXCOPY %orig% %dest%\%destinit% /L /Xdatareporting\ /Q3 /CBQ /CLONE /YY >> _fin.txt
FOR /F "skip=1 tokens=1-2 delims==" %%c IN ('type "_fin.txt"') DO SET titreF=%%c & SET sizeF=%%d & CALL :PROCESSF

MOVE %dest%\%destinit% %dest%\%destfin% >NUL
CHCP 65001 >NUL
ECHO ^[104mTaille finale (sans fichiers de configuration):[0m
echo Source     = %sizeorigF% octets
echo Sauvegarde = %sizedestfinF% octets
echo ^[103;92mDifférence = %diffF% octets[0m
echo:
GOTO END

:PROCESSF
set /a j=%j%+1
IF %j% EQU 2 SET sizeorigF=%sizeF%
IF %j% EQU 9 SET sizedestfinF=%sizeF%
IF %j% EQU 16 SET diffF=%sizeF%
exit /b

:COPY
echo:
echo ^[93mPatientez,Sauvegarde en cours...%[0m
XXCOPY %orig% %dest%\%destinit% /Xdatareporting\ /Q3 /CBQ /CLONE /YY >NUL
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
GOTO SIZEFIN

:END
pause
del thunder.txt
del _debut.txt
del _fin.txt
0
brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805 > brucine Messages postés 18721 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025
1 avril 2023 à 11:29

La restauration, ce ne sont pas des droits sur les dossiers Users qui plantent, mais l'incapacité de MOVE à ce que source et destination soient sur des partitions différentes (je ne sais pas ce qu'il avait bu, Gros Bill, quand il a inventé Windows...).

On en revient donc à ses premières amours avec XXCOPY et là, ça fonctionne:

 

@echo off
CHCP 65001 >NUL

set i=0
SET save=E:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\
SET profil=%Appdata%\Thunderbird\Profiles\

echo %time% > time.txt
FOR /F %%q IN ('type "time.txt"') DO SET heure=%%q
set time1=%heure:~0,2%
set time11=%heure:~0,1%
set time12=%heure:~1,1%
IF %time12%==: (
 GOTO AM
 ) ELSE (
 GOTO TIME
)
:AM
set time1=%i%%time11%
GOTO TIME

:TIME
del time.txt
set time2=%time:~3,2%
set date1=%date:~0,2%
set date2=%date:~3,2%
set date3=%date:~6,4%
SET "nom_save_heure=%date1%%date2%%date3%_%time1%h%time2%"

ECHO ^[104;93mRESTAURATION PROFIL THUNDERBIRD[0m
echo:
ECHO ^[103;91mNe fonctionne que s'il existe un profil[0m
ECHO ^[103;91mNe pas le supprimer ou, si crash, réinstaller Thunderbird avant[0m
echo:

:NOMPROFIL
DIR /B %profil% >> profil.txt
FOR /F %%a IN ('type "profil.txt"') DO SET nom_profil1=%%a & CALL :PROCESSPROFIL
GOTO NOMSAVE

:PROCESSPROFIL
SET nom_profil2=%nom_profil1:~-8%
IF %nom_profil2%==release SET nom_profil=%nom_profil1%
exit /b

:NOMSAVE
DIR /B %save% >> nom_save.txt
FOR /F %%b IN ('type "nom_save.txt"') DO SET nom_save=%%b
ECHO ^[104;93mNom de sauvegarde: %nom_save%[0m
echo:
ECHO ^[103;92mRenommer la sauvegarde au format (H)oraire (P)rofil (N)on?[0m
CHOICE /C HPN
IF %ERRORLEVEL% EQU 1 GOTO CHANGETOHOUR
IF %ERRORLEVEL% EQU 2 GOTO CHANGETOPROFIL
IF %ERRORLEVEL% EQU 3 GOTO SAUVEGARDE

:CHANGETOHOUR
echo:
IF EXIST "%save%\**_**h**" ECHO ^[103;91mSauvegarde déjà au format horaire![0m & GOTO SAUVEGARDE
IF NOT EXIST "%save%\**_**h**" MOVE %save%%nom_save% %save%%nom_save_heure% >NUL
ECHO ^[104;93mNouveau Nom de sauvegarde: %nom_save_heure%[0m
GOTO SAUVEGARDE

:CHANGETOPROFIL
IF EXIST "%save%\**_**h**" MOVE %save%%nom_save% %save%%nom_profil% >NUL
echo:
ECHO ^[104;93mNouveau Nom de sauvegarde: %nom_profil%[0m

:SAUVEGARDE
echo:
ECHO ^[103;92mVoulez-vous restaurer?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO PROCEED
IF %ERRORLEVEL% EQU 2 GOTO QUIT

:QUIT
echo:
echo:[103;91mAttention,Restauration Abandonnée![0m
GOTO END

:PROCEED
IF EXIST "%save%\**_**h**" MOVE %save%%nom_save% %save%%nom_profil% >NUL
RD /S /Q %profil%%nom_profil%
XXCOPY %save%%nom_profil% %profil%%nom_profil% /CLONE /YY >NUL
echo:
ECHO ^[103;92mRestauration effectuée[0m
echo:
ECHO ^[103;92mVoulez-vous rétablir la sauvegarde au format horaire?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO HEURE
IF %ERRORLEVEL% EQU 2 GOTO END

:HEURE
echo:
MOVE %save%%nom_profil% %save%%nom_save% >NUL
ECHO ^[104;93mNouveau Nom de sauvegarde: %nom_save%[0m

:END
echo:
pause
del profil.txt
del nom_save.txt
del time.txt
0