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
Bonjour, heureusement que mes posts ne sonnent pas chez les gens car j'ai une légère tendance oiseau de nuit à l'approche des weekend...
Bon, euh, comment dire : ai copié collé intégralemnt le dernier Script de synchronisation, en remplaçant uniquement E: par D: et le message est exactement le même que celui posté hier soir (ce matin..).
Si je fais fonctionner l'ancien batch du post 54, j'ai
Mystère..
Les valeurs de la fenêtre postée juste avant sont exactes (celles du script du post 54).
Et si je on retire les exclusions, celà pourrait il marcher ? Car je n'ai pas besoin d'exclusions
Que veux-tu que je te dise, chez moi ça marche, je viens de tester à nouveau des fois que mes modifications pour la nuit aient planté le script de jour.
Les exclusions n'ont aucune importance sinon que, si la taille des dossiers qui les renferme change (elle est susceptible de changer à chaque ouverture de Thunderbird), tu vas être alerté en permanence de sauvegardes inutiles.
Si elles ne te plaisent pas, tu enlèves les commutateurs d'exclusion, dans le script XXCOPY ils reposent sur le fait que c'est en principe le dossier datareporting sous le profil qui contient les fichiers coupables; dans la syntaxe PowerShell, on avait directement spécifié l'extension jsonlz4 ; je m'aperçois dans ce dernier cas que j'avais oublié le "l" de jsonlz4 dans une des sentences ECHO Taille, cela peut éventuellement fausser l'affichage de la taille de sauvegarde, mais pas le processus lui-même.
Mais ce ne sont pas elles qui sont responsables de l'erreur.
Si la taille de la sauvegarde est à 0 alors que tu n'aurais rien changé au script y compris par inadvertance, c'est soit que le chemin virtuel Thunderbird ou celui de destination que je t'ai repris ne sont pas bons, soit qu'il y a une erreur dans la variable de destination, soit que le copie se fait bien mais qu'il y a une erreur dans l'affichage de la taille de la sauvegarde.
Pour tester, s'agissant de mails qu'on ne reçoit pas à volonté, il faut faire comme moi: copier quelques fichiers bidon dans la source, sauvegarder, les enlever de la destination, recommencer.
Il faut tester physiquement: vérifier par propriétés des dossiers (et par simple exploration visuelle pour les fichiers bidon par exemple images) que leur taille est conforme, qu'une erreur de syntaxe n'a pas fait que la copie s'est bien faite, mais dans un autre sous-dossier, vérifier selon ce qu'on a fait la présence des fichiers bidon d'un côté ou de l'autre.
Partir ensuite à la chasse à l'erreur de formule dans le script (en faire préalablement une copie de sauvegarde dans un autre dossier): mettre REM devant @ echo off et vérifier l'absence de message d'erreur.
S'il en est ramené une et qu'on ne la localise pas exactement, mettre successivement un pause derrière chaque groupe de commandes.
Si on ne trouve toujours pas, évaluer les variables (celles dans les étiquettes :PROCESS doivent l'être à la fin du bloc CALL :PROCESS correspondants): enlever notre REM devant @ echo off puis introduire après chaque bloc echo %mavariable% et pause.
Je dois notamment vérifier l'echo/pause des variables:
-dans DOSSIERS: %dest% (emplacement physique de sauvegarde), %destfin% (horodatage date d'exécution), %destinit% (nom horodaté sauvegarde précédente).
-VIERGE: que %dest%\%destinit% correspond bien au chemin horodaté
-SIZE: vérifier que la valeur copiée est la bonne (3 blocs successifs source, destination, différence) dans les fichiers debut.txt et fin.txt; si elle l'est, c'est que les lignes XXCOPY sont correctes, et que les valeurs ont peut-être été mal sélectionnées dans la boucle PROCESS: faire l'écho avant les étiquettes :PROCESS des variables correspondant à source, sauvegarde et différence.
Mais bon, si le script a vraiment été copié à l'identique à part la lettre de lecteur, cela plaide plutôt pour un chemin de sauvegarde incorrect à vérifier ou bien que les couches ont été empilées: supprime tout dossier de la sauvegarde, ça doit repartir à VIERGE et te créer un dossier horodaté dont tu vérifies le contenu.
Recommences en supprimant quelques fichiers au hasard du dossier de sauvegarde.
Si tu es amené à faire des pause sur erreur et à sortir du script avant la fin, supprimes les fichiers txt sur le bureau dont sinon le contenu rajouté te mettra la zizanie.
Boonsoir brucine,
Ce n'est pas faute d'avoir :
- shunté l'echo off, et tebté de comprendre chaque ligne
- mis des pauses ça et là puis vérifié des valeurs
Il y a toujours quelque chose qui ne va pas dans la taille des dossiers, ce ce soit source/dest/diff
J'ai ensuite supprimé le dossier rdwdst72.default-release du rep de sauvegarde puis testé à nouveau
Il crée 1 dossier "02042023_18h40" (à la place de "rdwdst72.default-release"), dans lequel il a mis dossiers et fichiers source (dont des *json.lz4, *.json, *,.sqlite, etc..), mais pas tous car il manque le dossier "datareporting", quelques *,.sqlite.
Si, immédiatement après, je relance le batcht, j'ai
à ne rien y comprendre. Va t'il sonder une dossier rdwdst72.default-release qui n'existe plus ?
Sur le premier point, les différences sont faibles (respectivement de l'ordre de 230 Ko et exactement 1 Mo).
En dehors du dossier datareporting qui est manquant (c'est normal, je l'ai exclu), la copie transporte d'autres fichiers de configuration externes à ce dossier et que tu rapportes, rendant envisageable une variation infime de la source (230 Ko) pendant l'exécution du script.
Je t'ai alerté à ce propos depuis un moment, sauf à exclure tout ce qui peut varier hors les mails, ou plus intelligent ne copier que le dossier mails, les tailles risquent de ne pas être cohérentes; il va falloir que je fasse une installation Thunderbird bidon pour voir l'arborescence exacte des dossiers (mais qui n'aura bien sûr pas de mails sauf si j'en importe).
Sauf à chercher le rôle exact de chaque fichier sur la doc Mozilla, je ferai ça dès que j'aurai un moment (on se moque du datareporting de télémétrie mais pas de l'ensemble des bases de données sqlite dont certains représentent les bases de données de mots de passe, contacts...), on va donc forcément retourner de petites différences.
Il n'y a pas sauf à isoler le rôle de chacun de ces fichiers (à nouveau je testerai sur une installation Thunderbird dès que j'aurai un moment) de solution à 100%: soit on se moque de l'affichage des tailles et on fait une tâche planifiée incrémentielle de copie quotidienne (c'est ce que je fais, en une ligne XXCOPY), soit on triche en gardant l'exclusion pour le calcul des tailles mais pas pour la copie réelle, mais ce qui va forcément rendre une différence si on n'enlève pas aussi l'exclusion à la troisième ligne XXCOPY de :SIZEFIN
A :COPY, remplacer par (en enlevant le filtre d'exclusion) par:
XXCOPY %orig% %dest%\%destinit% /Q3 /CBQ /CLONE /YY >NUL
Sur le nom horodaté du fichier 02042023_18h40, c'est normal, on a fait exprès à ta demande d'avoir un Log d'exécution de la sauvegarde sans créer des fichiers Log; tu as en <119> un batch de restauration qui fait exactement l'inverse en cas de besoin: renommer 02042023_18h40 en rdwdst72.default-release avant de copier dans l'autre sens.
Les fichiers _debut.txt, _fin.text et thunder.txt sont effacés en :END si on ne ferme pas le batch avant par échappement ou fermer avec la croix, ils servent respectivement à consigner les tailles source, destination et différence avant et après copie et à sélectionner dans les 2 valeurs m0t3lq06.default rdwdst72.default-release celle qui nous intéresse (la deuxième); si on n'avorte pas le script, -debut.txt ne peut pas être vide sans quoi on n'aurait pas de valeurs initiales sauf si les valeurs des variables correspondantes sont erronées: entrer sous la dernière ligne XXCOPY à :SIZEDEBUT un echo des variables %orig% et %dest%\%destinit% suivi de pause pour vérifier.
On suppose qu'à la première itération il n'y a aucun dossier dans la destination et qu'après on n'a pas modifié le nom de celui qui est créé, et qu'on a effacé du bureau les 3 fichiers txt s'ils y sont restés.
A la deuxième itération (attendre une ou deux minutes pour que l'heure change), dans :DOSSIERS, la séquence:
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
teste l'existence d'un dossier s'appelant **_**h** (dossier horodaté) dans la destination, le crée à :VIERGE à l'heure courante s'il n'existe pas, dans le cas contraire fait la même chose à la ligne SET mais met dans la ligne FOR dans %destinit% l'horodatage du dossier déjà existant: si la taille de quelque chose "qui n'existe pas" est calculée, la sauvegarde initiale vaudra forcément 0.
Je dois donc m'assurer que la syntaxe IF NOT permettant de ne pas aller à :VIERGE fonctionne en mettant juste sous vierge echo toto et pause: je ne dois pas voir "toto".
Et je dois m'assurer que %destinit% est bien créé en FOR en mettant après FOR echo %destinit% et pause, moyennant quoi la section :SIZEDEBUT ne fait que lire ces variables.
Dans le doute de leur récupération dans le fichier _debut.txt, mettre après chaque ligne IF EQU de :PROCESSD une ligne supplémentaire IF %i% EQU 2 ECHO %sizeorigD% (idem pour les 2 autres lignes) suivi de pause après la dernière.
Oublié de dire qu'il me crée 2 fichiers sur le bureau (le batch que je lance est aussi sur mon bureau) :
- 1 _debut.txt : vide
- 1 thunder.txt : qui contient :
m0t3lq06.default
rdwdst72.default-release
Te fatigues pas, j'ai trouvé le bug en installant Thunderbird et en y migrant quelques mails.
Comme je ne peux pas y changer les fichiers Inbox sans risquer de mettre le bazar dans ma boîte mail normale, j'ai copié dans la source des fichiers qui ne sont pas dans la destination et vice-versa.
La seule différence de ce montage avec mes tests précédents, c'est qu'il y a des sous-dossiers alors que mes tests n'avaient que des fichiers à la racine: XXCOPY me fait du zèle et affiche les fichiers excédentaires des sous-dossiers dans le fichier _debut.txt avec autant de lignes que de fichiers (donc en nombre variable), ce qui a pour effet de planter la recherche des bonnes valeurs ordonnées aux lignes 2, 9 et 16 ainsi déplacées.
Curieusement, ça ne plante que quand c'est la destination qui comporte de tels fichiers.
Je n'ai pas envie de chercher la parade ce soir, demain, il fera jour, mais en attendant, ça ne sert à rien que tu te battes contre des moulins, laisse en l'état.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionEn ayant remplacé par
XXCOPY %orig% %dest%\%destinit% /Q3 /CBQ /CLONE /YY >NUL
C'est génial, ça marche ! La copie s'effectue dans 1 dossier "03042023_15h03". Je ne sais pas si l'absence des quelques fichiers de moins d'un Mo auront un impact lors de la restitution du dossier et quand on relance thunderbird, car la source détectée pr le batch est de 9 075 467 862 octets alors que dans ses propriétés elle fait 9 076 434 571 octets, soit 966 709octets, ce qui n'est vraiment pas grand chose..
Et si je relance le batch juste après :
Différence = 0 octets Différence nulle: Synchronisation inutile
Donc tout fonctionne à merveille, même 8mn plus tard. Franchement top ! Merci
Et Merci aussi d'avoir pris la peine d'installer thunderbird pour celà. Ducros ne s'est pas seulement décarcassé, il s'est éviscéré.... ;)
Je t'ai fait une nouvelle version qui commence par ne tester que la taille du dossier Mail de Thunderbird (existence de nouveaux mails) puis qui propose d'enchaîner sur celle du profil en entier (contacts, favoris, identifiants, fichiers de configuration...), à faire de temps à autre.
Elle ne prend pas en charge le cas où les mails de destination sont plus gros que ceux de la source (différence de taille qui aurait pour résultat de supprimer l'excédent de la destination), mais cette situation relève normalement d'une restauration dont tu as le script.
Tu me donneras l'écho.
@echo off
set z=0
MD %~dp0_temp
echo %time% > %~dp0_temp\time.txt
FOR /F %%q IN ('type "%~dp0_temp\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=%z%%time11%
GOTO TIME
:TIME
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\ >> %~dp0_temp\_thunder.txt
FOR /F %%v IN ('FINDSTR "release" %~dp0_temp\_thunder.txt') DO SET nomthunder=%%v
SET "orig=%AppData%\Thunderbird\Profiles\%nomthunder%"
SET "dest=E:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird"
SET "destfin=%date1%%date2%%date3%_%time1%h%time2%"
echo:
ECHO ^[104;93mSAUVEGARDE THUNDERBIRD[0m
echo:
IF NOT EXIST "%dest%\**_**h**" GOTO VIERGE
FOR /F %%p IN ('DIR /B "%dest%\**_**h**"') DO SET destinit=%%p
GOTO SIZEMAILDEBUT
:VIERGE
SET destinit=%date1%%date2%%date3%_%time1%h%time2%
MD %dest%\%destinit%
GOTO SIZEMAILDEBUT
:SIZEMAILDEBUT
CHCP 1252 >NUL
XXCOPY %orig%\Mail C:\_TEMPD /L /Q3 /CBQ /CLONE /YY >> %~dp0_temp\_Mailorigdebut.txt
XXCOPY %dest%\%destinit%\Mail C:\_TEMPD /L /Q3 /CBQ /CLONE /YY >> %~dp0_temp\_Maildestdebut.txt
XXCOPY %orig%\Mail %dest%\%destinit%\Mail /L /Q3 /CBQ /CLONE /YY >> %~dp0_temp\_Maildiffdebut.txt
FOR /F "tokens=1,2 delims==" %%g IN ('FINDSTR "Total" %~dp0_temp\_Mailorigdebut.txt') DO SET sizemailorigdebut=%%h
FOR /F "tokens=1,2 delims==" %%i IN ('FINDSTR "Total" %~dp0_temp\_Maildestdebut.txt') DO SET sizemaildestdebut=%%j
FOR /F "tokens=1,2 delims==" %%k IN ('FINDSTR "Total" %~dp0_temp\_Maildiffdebut.txt') DO SET sizemaildiffdebut=%%l
CHCP 65001 >NUL
ECHO ^[104mTaille Mails:[0m
echo Mails Source = %sizemailorigdebut% octets
echo Mails Sauvegarde = %sizemaildestdebut% octets
set diff1maildebut=%sizemaildiffdebut:~1%
set diff2maildebut=%diff1maildebut:~0,1%
IF %diff2maildebut% LSS 1 (
echo ^[103;92mPas de nouveau mail: %sizemaildiffdebut% octets[0m & GOTO NOMAIL
) ELSE (
echo ^[103;91mNouveaux Mails: %sizemaildiffdebut% octets[0m & GOTO CHOICEMAIL
)
:CHOICEMAIL
echo:
ECHO ^[93mSauvegarder les nouveaux mails?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO COPYMAIL
IF %ERRORLEVEL% EQU 2 GOTO QUITMAIL
:CHOICEPROFIL
echo:
ECHO ^[93mSauvegarder le Profil?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO COPYPROFIL
IF %ERRORLEVEL% EQU 2 GOTO QUIT
:NOMAIL
echo:
echo ^[103;92mVoulez-vous afficher le reste du profil?[0m
CHOICE /C ON
IF %ERRORLEVEL% EQU 1 GOTO SIZEPROFILDEBUT
IF %ERRORLEVEL% EQU 2 GOTO END
:NOCOPY
echo:
echo ^[103;92mDifférence nulle: Synchronisation Profil inutile[0m
GOTO END
:QUIT
echo:
echo ^[103;91mAttention, Synchronisation Abandonnée



