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 18726 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
15 mars 2023 à 12:37

Voici le script qui fonctionne bien, celui sans ajout de l'opération de copie/remplacement :

$orig="C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
$dest="D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
$to=(Get-ChildItem $orig -Recurse | Measure-Object -Property Length -Sum).Sum 
$td=(Get-ChildItem $dest -Recurse | Measure-Object -Property Length -Sum).Sum
$diff=$to-$td
if ($to -eq $td)
{ echo "$dest égal $orig" 
} else
{ "    {0} =      {1:n0}
    {2} = {3:n0}
    Difference =                                                                             {4:n0}   " -f $orig, $to, $dest, $td, $diff  }
echo .
pause

Ceci dit, il ne fonctionne que si son lancement depuis "Powershell.ps1" se fait depuis mon bureau. Si je le déplace ailleurs, la fenêtre powershell s'ouvre et se ferme façon "flash"...

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

Je te garantis que ça, ça fonctionne parfaitement sur les 2 étapes, y compris si je l'exécute d'une partition non système; j'ai modifié l'écho pour ne pas avoir à rentrer approximativement les espaces et le retour à la ligne à la main.

Ne pas appeler un fichier d'un nom de commande, que ce soit Powershell.ps1 ou shutdown.cmd, ça m'a valu des surprises par le passé où l'interpréteur de commandes analyse le nom du fichier comme une commande, renommer toto.ps1 ou ce que tu veux.
 

$orig="G:\photos\antibes"
$dest="C:\Users\brucine\Desktop\antibes"
Remove-Item "$dest" -Recurse | Out-Null
New-Item "$dest" -Type Directory | Out-Null
Get-Childitem "$orig" | Copy-Item -Destination "$dest" -Recurse
$to=(Get-ChildItem $orig -Recurse | Measure-Object -Property Length -Sum).Sum 
$td=(Get-ChildItem $dest -Recurse | Measure-Object -Property Length -Sum).Sum
$diff=$to-$td
if ($to -eq $td)
{ echo "Il n'y a pas de différence" 
} else
{ echo "$orig = $to"
  echo "$dest = $td"
  echo "Différence = $diff" }
echo .
pause
0

Voici mon script :

$orig="C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
$dest="D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
Remove-Item "$dest" -Recurse | Out-Null
New-Item "$dest" -Type Directory | Out-Null
Get-Childitem "$orig" | Copy-Item -Destination "$dest" -Recurse
$to=(Get-ChildItem $orig -Recurse | Measure-Object -Property Length -Sum).Sum 
$td=(Get-ChildItem $dest -Recurse | Measure-Object -Property Length -Sum).Sum
$diff=$to-$td
if ($to -eq $td)
{ echo "Il n'y a pas de différence" 
} else
{ echo "$orig = $to"
  echo "$dest = $td"
  echo "Différence = $diff" }
echo .
pause

Si je le lance par 1 double clic sur toto.ps1, il ouvre une fenêtre powershell qui disparaît aussitôt.. Son temps d'apparition me laisse penser qu'il n'effectue aucune copie, car l'opération de copie prend normalement 20 secondes.

Si je le lance par 1 clic droit, en mode admin, la feêtre suivante apparaît

Le résultat est le même si mon ps1 est enregistré sous NOTEPAD en encodage Ansi, ou sous Notepad++ encodage OEM 850....

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

Ce que je ne comprends pas, c'est que le "script" affichait tailles et différence sans souci avant d'y ajouter les commandes de copie....

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

celui-ci

$orig="C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
$dest="D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
$to=(Get-ChildItem $orig -Recurse | Measure-Object -Property Length -Sum).Sum 
$td=(Get-ChildItem $dest -Recurse | Measure-Object -Property Length -Sum).Sum
$diff=$to-$td
if ($to -eq $td)
{ echo "$dest égal $orig" 
} else
{ "    {0} =      {1:n0}
    {2} = {3:n0}
    Difference =                                                                             {4:n0}   " -f $orig, $to, $dest, $td, $diff  }
echo .
pause

qui affiche

Les tailles source et cible sont différentes car j'ai reçu des mails depuis...

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

Le codage ANSI ne sert à rien dans PowerShell en tant que tel: il est seulement destiné à l'affichage correct des accents ("égal") quand tu copies un code ici dans un fichier texte puis que tu enregistres ce texte sous ps1.

Je ne vois a priori pas d'erreur de syntaxe, quand on a synchronisé les dossiers, le seul résultat doit être l'écho pas de différence en <10> s'il y a une pause.

Testes la partie copie et la partie affichage en recopiant textuellement (sauf le chemin, bien entendu) le code en <38> pour voir éventuellement à quel niveau ça coince.

Commente les lignes 3 à 5 en mettant # devant pour vérifier que l'affichage est correct; vérifie les 2 cas de figure en remplaçant ligne 9 -eq par -ne.

Vérifie maintenant la validité de l'opération de copie en décommentant les lignes 3 à 5 et en laissant la ligne 9 à -eq: tu dois avoir l'affichage des tailles et d'une différence nulle.

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
15 mars 2023 à 21:29

J'ai trouvé la solution pour les opérations de suppression/recréation et copie

# Supprimer le dossier destination sur le lecteur D:
Remove-Item D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release -Recurse -Force

# Recréer le dossier destination sur le lecteur D:
New-Item -ItemType Directory -Path D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release

# Copier l'intégralité des dossiers et fichiers contenus dans l'origine vers la destination:
Copy-Item C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release* D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird -Recurse -Force

$orig="C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
$dest="D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
$to=(Get-ChildItem $orig -Recurse | Measure-Object -Property Length -Sum).Sum 
$td=(Get-ChildItem $dest -Recurse | Measure-Object -Property Length -Sum).Sum
$diff=$to-$td
if ($to -eq $td)
{ echo "$dest égal $orig" 
} else
{ "    {0} =      {1:n0}
    {2} = {3:n0}
    Difference =                                                                           {4:n0}   " -f $orig, $to, $dest, $td, $diff  }
echo .
pause

Le seul souci, c'est que la fenêtre se ferme dès la copie terminée, et ne m'affiche pas notre compte-rendu...

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

J'abandonne.

On améliore la sortie écran, on te propose de tester par étapes ce qui ne fonctionne pas, à la place tu écris autre chose y compris en conservant "égal', ça fait tâche, alors qu'en l'état le script doit fonctionner, introduisant de ce fait d'éventuelles autres causes de dysfonctionnement, on n'y arrivera jamais.

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

Cela dit, si tu demandes à la machine d'afficher une différence qui n'est pas définie, elle obéit, elle n'affiche rien...

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

Désolé de te voir réagir ainsi...  :(

Ma réponse à ton test du 15 mars 2023 à 20:29 est passée à la trappe dans le fil de discussion. Elle signalait que quand je squizait les opérations de copie et corrigeais les points indiqués, j'avais "Il n'y a pas de difference" alors qu'il y en avait une. Lorsque je précédait d'une copie (ôter les # ligne 3 à 5), j'avais "Difference = 0". Je comprends ton "agacement" à constater une inobservation de tes consignes, vu le mal que tu te donnes, mais ce n'était pas le cas...

Encore une fois, je suis néophyte, et ne comprends pas l'intégralité des consignes suggérées, par exemple "Testes ... le code en <38> pour voir... " me semblait pointer une ligne 38 qui n'existe pas.. Je t'avais aussi exposé cette interrogation...

Encore une fois, pas de péril en la demeure. Ma demande de conseils n'a rien de vital, c'est un pur confort soumis à votre bon coeur...

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

<38> est le numéro du message concerné; si on tronque l'affichage de echo "Différence", on n'a aucune chance de la voir s'afficher.

Si tu préfères comme jee pee la sortie de l'affichage sur une seule ligne ou, pour le moins, à plusieurs lignes obtenues artisanalement en appuyant sur entrée et espace entre les différents affichages, il ne faut pas non plus tronquer la valeur de "Difference" à la dernière ligne, qu'il faut conformer à ce qu'elle est, message <25> ligne 9 (Différence = {4:n0}) si on veut que quelque chose s'affiche.

Si on ne trouve pas le bug dans un script au premier regard, la façon de résoudre, c'est d'isoler chaque étape et/ou d'introduire une ligne echo de la variable concernée pour localiser l'erreur, pas d'écrire autre chose à la place.

Moyennant quoi, si ça ne marche pas après correction de l'affichage (étonnant, mon script en <38> est testé), il faut se reporter à ce que j'ai détaillé en <42> pour localiser l'erreur quitte à demander si on ne comprend pas ce qui y est écrit au lieu de partir dans une autre direction; si ça fonctionne, on aura toujours "Il n'y a pas de différence", pour tester l'hypothèse contraire, remplacer comme illustré en <42> ) -eq par -ne

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

Si tu continues à être fâché avec la ligne de commande, j'ai trouvé par hasard ça qui est assez intéressant.

Gratuit pour une utilisation personnelle, permet de sauvegarder non seulement ses messages mais ses profils et les paramètres du registre si on veut (et aussi pour les navigateurs), programmable en incrémentiel et en tâche planifiée vers tout type de support (local, réseau, Cloud), rendant les éventuelles erreurs de copie.

A l'inconvénient de ne rendre pour une raison curieuse la sortie qu'à un format compressé zip (mais dont on pourra toujours extraire les données), et bien sûr en cas de crash disque ou de formatage de devoir réinstaller le logiciel pour importer la sauvegarde sauf à récupérer manuellement les données du zip sans les paramètres du logiciel de mail.

https://www.commentcamarche.net/telecharger/communication/13407-kls-mail-backup/

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

Merci brucine pour ce lien. J'ai testé ce soft, pas mal du tout... mais....

....corrections faites sur le ps1..... fantastique, ça marche ! Grand merci. Du coup, j'ai Mis une ligne pense-bête pour ajouter ou retirer le # en début les lignes 3 à 5. Ainsi, soit il y a copie avec vérif, soit il y a comparaison seule. Tu as donc résolu mon souci d'un mini-script, rapide et efficace. Peut être existe t'il une commande à ajouter ou retirer pour voir avec plus de transparence les opés de copie, mais je t'avais promis de ne pas en demander trop, et il fait le boulot comme souhaité.

Merci encore !

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

Pour les fioritures, c'est compliqué d'avoir fromage et dessert dans le même "langage".

Pour PowerShell on peut, pourquoi pas, ajouter une barre de progression, mais bon...

Qu'il s'agisse de PowerShell ou de Robocopy, on n'a aucune raison de mettre en évidence des différences de copie après synchronisation puisque par définition il n'y en a pas.

On peut par contre vouloir comparer source et destination avant synchronisation, ie ne lancer le script de synchronisation que si des différences sont mises en évidence.

La syntaxe PowerShell mise en place calcule la taille des dossiers, mais ne compare pas les fichiers et, formellement parlant, bien que peu probable, on pourrait imaginer que des tailles soient identiques avec des fichiers différents.

Une syntaxe Compare-Object pourra y rendre compte de ces différences, mais n'est pas facile à mettre en place, on a vu par contre que Robocopy, mais qui lui est davantage fâché avec l'arithmétique pour rendre la différence de taille de 2 dossiers très différents (ou excédent la limite 32 bits)  est le meilleur outil pour le faire via une simple ligne de commande.

Il serait alors peut-être plus simple d'intégrer au PowerShell un préalable Robocopy qui affiche les différences éventuelles en explicitant les fichiers concernés, puis de chaîner vers la synchronisation seulement si cette différence existe; cette synchronisation est d'ailleurs plus simple à écrire en une seule ligne dans Robocopy, ce qui n'amènerait à se servir de la partie PowerShell que pour l'affichage des tailles et le calcul de leur différence.

On peut, pour ne se confiner qu'à ce que l'on veut, diriger la sortie Robocopy vers des variables à l'écran ou un fichier texte temporaire pour n'afficher que les noms et tailles de ces fichiers, et sortir du script sans synchronisation s'il n'y en a pas.

A toi donc de préciser ce que tu souhaites.

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

Tiens, cadeau, j'ai laissé volontairement la ligne rem après SET, l'enlever devant cette ligne et le mettre devant la deuxième ligne SET pour tester les 2 hypothèses.

 

@echo off
CHCP 65001 >NUL

SET "orig=G:\photos\antibes"
SET "dest=C:\Users\brucine\Desktop\antibes"
rem "dest=G:\photos\antibes"

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
echo .
echo Source ... = %to%
echo Sauvegarde = %td%
echo .
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e

IF %diff% EQU 0 (
 echo ^[32mDifférence = %diff%[0m
 echo . 
 pause
 goto end
) else (
 echo ^[31mDifférence = %diff%[0m
 echo .
 goto diff
)

:DIFF
ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /L /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
echo .
pause

:PROCESS
ECHO %size% %name%

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

Attention au caractère à copier qui n'apparaît pas avant chaque [

Si la recopie du texte (dans un script cette fois-ci batch cmd, et pas ps1) ne le ramène pas, il s'agit du caractère ESC produit par la combinaison de touches CTRL+[ qu'on peut ensuite copier et coller au kilomètre une fois l'aspect correct obtenu (tout se passe comme s'il y avait un petit rectangle blanc vide avant les [

Pas primordial, mais colore la différence en vert si elle est nulle et en rouge dans le cas contraire.

https://ss64.com/nt/syntax-ansi.html

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

Et bien sûr enlever le /L de ROBOCOPY pour ne pas faire qu'une simulation de copie

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

Si c'est pas top ça ...!

Plus que je l'espérais pour un batch...grand merci et bravo.

Si j'ai bien compris, il repère les différences et m'indique les fichiers incriminés ? Franchement ça va loin..

J'ai juste enlevé les "[32mD" et "[31mD" qui apparaissaient, et remplacé "[0m" par "octets".

Par contre, si j'enlève le "/L" de robocopy, l'ordi travaille 1 seconde, puis me restitue ça

Ce qui me laisse penser qu'il copie de la sauvegarde vers la source..

voici le batch sans "/L"

@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 "dest=G:\photos\antibes"

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
echo .
echo Source ... = %to%
echo Sauvegarde = %td%
echo .
FOR /F %%e IN ('powershell %to%-%td%') DO SET diff=%%e

IF %diff% EQU 0 (
 echo ^Différence = %diff% octets
 echo . 
 pause
 goto end
) else (
 echo ^Différence = %diff% octets
 echo .
 goto diff
)

:DIFF
ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
echo .
pause

:PROCESS
ECHO %size% %name%

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

Evidemment, j'aurais du mieux regarder la ligne 30.... :((

C'est ça de vouloir aller trop vite en baissant la tête. Pas de grosses pertes puisque je reçois peu de mails pro le wwekend..

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

Au temps pour moi, j'ai testé n'importe comment puisque en mode simulé source et destination n'ont bien sûr pas d'importance, mais en mode réel il faut bien sûr "robocopier" source vers destination et pas le contraire.

La ligne "rem" est destinée à être supprimée quand on a testé les 2 cas de figure et qu'ils fonctionnent.

La syntaxe echo ^[xxmDifférence = %diff%[0m me retourne la chaîne Différence = %diff% ou n'importe quoi que je mets entre  [xxm et [0m en vert si xx = 32 (tout va bien) ou en rouge si xx =31 (je suis alerté que la différence n'est pas nulle).

Si je veux afficher un texte supplémentaire (en l'espèce "octets"), je dois remplacer exactement au même endroit
Différence = %diff% par Différence = %diff% octets (et aussi rajouter octets derrière echo de source et sauvegarde)
mais sans toucher au reste si je veux "bénéficier" de l'effet couleur.
 

Dans tous les cas de figure, il y a probablement encore du peaufinage derrière en excluant certains types de fichiers:
de mémoire, je n'utilise plus Thunderbird depuis des lustres, les fichiers json, ce sont des fichiers de configuration y compris de session, ce qui signifie qu'ils sont mis à jour dès que je rouvre Thunderbird.

Il faut bien sûr sauvegarder l'intégralité du profil Thunderbird au cas où, mais si je demande à être alerté de nouveaux mails envoyés ou reçus, ce sont les fichiers Mbox qui eux, manque de pot, n'ont pas d'extension mais seulement une localisation.

http://kb.mozillazine.org/Files_and_folders_in_the_profile_-_Thunderbird

Il est probable que pour que les alertes soient valides, il faudrait donc amender une syntaxe Robocopy /L assortie d'un masque d'exclusion (ça fait partie des options Robocopy), sans quoi on risque d'être notifié de fichiers différents à chaque ouverture de Thunderbird même sans mails reçus, ce n'est pas le but, et l'ensemble y compris fichiers de configuration ne serait alors synchronisé que par une syntaxe Robocopy elle entière seulement en même temps que de nouveaux mails.

Ta copie "nulle" ne montre pas que la sauvegarde s'est effectuée dans un sens plutôt que dans l'autre, les tailles ne seraient pas identiques comme ta copie le montre, mais que les 2 sens sont déjà synchronisés: c'est pourquoi, comme tu l'as observé, je teste sur un dossier contenant des photos; je fais une copie de sécurité de l'original ailleurs, puis je copie ce dossier sur le bureau en y supprimant volontairement quelques photos, il représente alors la destination.

Pour les problèmes de "masque" et une fois que le basique est testé comme ci-dessus, je pense qu'il faut faire la même chose du dossier Thunderbird pour tester les éventuels artefacts (comme les fichiers json): copie de sécurité ailleurs, copie à un autre emplacement et copie sur le bureau à laquelle on enlève volontairement 2 ou 3 mails.

On peut plus simplement copier leur dossier à un instant t sur le bureau, même chose à l'instant t+1 dans un autre dossier quand j'ai reçu de nouveaux mails: je vais écraser ce dossier t dans la destination bidon et t+1 dans la source bidon, ce qui va me permettre de recommencer l'opération autant de fois que je veux pour tester en conditions réelles.

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

La bascule de couleur d'affichage 31 ou 32 ne fonctionne pas chez moi.
Par exemple, la fenêtre m'affiche "[31mDifférence = 2521632[0m" et non des chiffres en couleur..
J'utilise pourtant le cmd.exe "classique" de windows
Dommage car la couleur, rouge pour diff, et vert si zéro diff, alerte bien ..

Pour "octets", je sais maintenant ou ajouter la chose

Le dossier "rdwdst72.default-release" contient quasiment ttes les infos : mails, settings, etc.. qui me sont nécessaires de sauvegarder, et les json sont effectivement données de préférences.
En définitive, ce n'est pas tellement important que je saches quels fichiers sont manquants pour mon usage de mails, mais ça pourra être utile pour un autre usage, comme dans ton exemple de photos.
Par exemple celles sur un téléphone, et celles sauvegardées.


Vérification faite par la suite, mon loupé (dest->orig) n'a pas affecté la source. Les tailles indiquées m'ont inquiété pour rien. Ouvrir thunderbird m'a rassuré.

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

je crois me souvenir qu'on avait réussi à afficher les tailles avec séparateur de milliers, mais je confonds peur être et me mélange les pinceaux..

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

Pour les couleurs, je suis blond, je n'arrive plus à reproduire le symbole d'échappement au clavier.

Tu vas sur ce site:
https://gist.githubusercontent.com/mlocati/fdabcaeb8071d5c75a2d51712db24011/raw/b710612d6320df7e146508094e84b92b34c77d48/win10colors.cmd

Tu copies tout et tu colles dans un fichier que tu appelles par exemple color.cmd, tu mets une pause à la dernière ligne, ce qui m'intéresse, ce sont les petits rectangles qu'on n'arrive pas à rentrer; si tu veux du rouge, c'est la première ligne 31m Red qui te concerne.

Tu effaces tout ce qui précède le premier crochet SAUF le petit rectangle, donc ^<ESC^>[31m y compris l'espace après m, il ne reste plus qu'à remplacer Red par le blabla voulu Différence = %diff% octets

Concernant le séparateur de milliers, il apparaît dans les "calculs" de par exemple une commande DIR, mais pas dans la sortie Powershell; si tu y tiens, il faut écrire un script supplémentaire qui insère avant l'écho un espace tous les 3 caractères à partir de la droite (ou qui fait des divisions successives par 1000, mais on va retomber sur le même travers si le nombre dépasse la limite 32 bits).

Je n'ai pas envie ce soir, j'étudierai la chose demain.

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

En batch, c'est compliqué, en PowserShell, les doigts dans le nez:

Mettre après les 2 premières condition FOR 2 autres:

FOR /F %%g in ('powershell -c "'{0:N0}' -f %to%"') do set to1=%%g
FOR /F %%h in ('powershell -c "'{0:N0}' -f %td%"') do set td1=%%h

Remplacer dans l'echo Source et Sauvegarde to et td par to1 et td1

Après la ligne FOR qui calcule la différence, même chose avec:

FOR /F %%i in ('powershell -c "'{0:N0}' -f %diff%"') do set diff1=%%i

et à suivre les %diff% d'echo par %diff1%

Il y a évidemment moyen de faire ça de manière plus élégante en une seule ligne PowerShell mais ça me fatigue, c'est plus simple comme ça, et je ne raffole pas de l'idée de calculer sur des nombres où les milliers sont séparés.

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

Comme disent les libraires, édition revue et augmentée spécifique à Thunderbird, et qui ne fonctionnera évidemment pas en cas de MAJ Thunderbird, la synchronisation sera alors forcée au mail reçu suivant.

-Pour les retours à la ligne, j'ai remplacé echo . par echo: , c'est plus décoratif
-J'ai exclu dans TESTDIFF les fichiers txt, en ce qui te concerne, ce sont les fichiers jsonlz4 s'il n'y a pas d'autre parasite.
-Je suis parti du principe que, en l'absence de nouveau mail, il n'y a pas de différence en dehors des fichiers de configuration: il ne sert à rien d'afficher les tailles et différence, on va directement à NOCOPY
-Dans le cas contraire, à partir de la section DIFF, on affiche les tailles et la différence, on liste les fichiers qui seront copiés, on fait la copie confirmée par un message.

 

@echo off
CHCP 65001 >NUL
echo ^[93mSAUVEGARDE THUNDERBIRD[0m

SET "orig=G:\photos\antibes"
SET "dest=C:\Users\brucine\Desktop\antibes"
rem "dest=G:\photos\antibes"

:TESTDIFF
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /L /XF *.txt /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g
ECHO %size%>size.txt
FOR /F "tokens=1 delims= " %%m IN ('type "size.txt"') DO SET testsize=%%m
IF %testsize%==Commande (
 GOTO NOCOPY
) else (
 GOTO DIFF
)

: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 %%g in ('powershell -c "'{0:N0}' -f %to%"') do set to1=%%g
FOR /F %%h in ('powershell -c "'{0:N0}' -f %td%"') do set td1=%%h
echo:
echo Source ... = %to1% octets
echo Sauvegarde = %td1% octets
echo:
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 ^[31mDifférence = %diff1% octets (dont fichiers de configuration)[0m
echo:

ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /L /XF *.txt /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
pause

:PROCESS
ECHO %size% %name%
GOTO END


:NOCOPY
echo ^[32mIl n'y a pas de nouveau mail, pas de synchronisation[0m
pause

:END
DEL size.txt

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

A :END il faut lire:

IF exist size.txt DEL size.txt

Plus propre, on exclut directement dans PowerShell et plus dans Robocopy, les tailles sont rendues après exclusion (donc sans les fichiers de configuration), on n'a plus besoin de tester la valeur de différence autrement que par celle entre source et destination hors fichiers de configuration, le tout au format séparateur de milliers, ce qui donne ça:

 

@echo off
CHCP 65001 >NUL

SET "orig=G:\photos\antibes"
SET "dest=C:\Users\brucine\Desktop\antibes"
rem "dest=G:\photos\antibes"

echo ^[93mSAUVEGARDE THUNDERBIRD[0m
echo:

:DIFF
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse -Exclude:*.txt| Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.txt| 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 -Exclude:*.txt| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.txt| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
echo:

echo ^[31mDifférence = %diff1% octets[0m

echo:

ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /L /XF *.txt /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
pause

:PROCESS
ECHO %size% %name%
GOTO END


:NOCOPY
echo:
echo ^[32mIl n'y a pas de nouveau mail, pas de synchronisation[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
21 mars 2023 à 20:50

Bonsoir brucine, et merci

Voici la fenêtre après exécution de ton dernier script

La taille source est bonne , mais la taille dest est 9 055 789 172 octets, ce qui n'est pas reporté dans la fenêtre .

La différence est donc incorrecte.

J'ai testé le script du site que tu conseilles. Je n'ai que des lignes :

[0m
'[0m' n’est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.

Quoique je fasse, même les modifs que tu conseille, je n'arrive pas, soit avec le script du site, soit avec ton dernier script, à obtenir des couleurs (d'ou les [93mxxxx[0m, [31mxxxx[0m ou [32mxxxx[0m qui apparaissent en texte...

Mon cmd.exe serait il corrompu ?

Quel gachis car je vois qu'en plus, tu as fait apparaitre la date de sauvergarde, etc...

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

Le site n'acceptant pas ma copie d'écran, voici ce que j'obtiens en lançant le batch en admin

[93mSAUVEGARDE THUNDERBIRD[0m
La variable d’environnement D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release n’est pas définie.
[93mSAUVEGARDE THUNDERBIRD[0m


Taille hors fichiers de configuration:
--------------------------------------
Source.... = 9 071 084 498 octets
Sauvegarde = Get-ChildItem octets
Sauvegarde = Au octets
Sauvegarde = + octets
Sauvegarde = + octets
Sauvegarde = + octets
Sauvegarde = edAccessException octets
Sauvegarde = + octets
Sauvegarde = 5 691 922 118 octets

[31mDifférence = 3 379 162 380 octets[0m

Fichiers à copier:
------------------
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.
Commande ECHO désactivée.

[32mSauvegarde effectuée le 21/03/2023[0m

Appuyez sur une touche pour continuer...
0
bibi2224 Messages postés 95 Date d'inscription vendredi 10 mars 2023 Statut Membre Dernière intervention 19 octobre 2023 2
21 mars 2023 à 21:29

C'est le résultat du script entier mis à ma sauce :

@echo off
CHCP 65001 >NUL
echo ^[93mSAUVEGARDE THUNDERBIRD[0m

SET "orig=C:\Users\bibi\AppData\Roaming\Thunderbird\Profiles\rdwdst72.default-release"
SET "D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"
rem "dest=G:\photos\antibes"

echo ^[93mSAUVEGARDE THUNDERBIRD[0m
echo:

:DIFF
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse -Exclude:*.txt| Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.txt| 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 -Exclude:*.txt| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.txt| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
echo:

echo ^[31mDifférence = %diff1% octets[0m

echo:

ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /L /XF *.txt /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
echo:
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
pause

:PROCESS
ECHO %size% %name%
GOTO END


:NOCOPY
echo:
echo ^[32mIl n'y a pas de nouveau mail, pas de synchronisation[0m
echo:
pause

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

ç'est fatigant, si tu fais ta sauce, suis la recette: tu ne lis pas ce que t'on écrit et tu n'en tiens aucun compte; évites les "typos" de recopie, il suffit de recopier le script textuellement en changeant juste source, destination et extensions concernées, sans quoi ça sert à quoi que comme Ducros je me décarcasse...

Sans chercher pour l'instant plus loin:

SET "D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"

ne peut pas fonctionner puisque, en effet, la variable n'est pas définie, ce qu'une simple relecture aurait permis de déceler.

SET "dest=D:\bibi\Pro\Documents\Sauvegardes_pro\Mails_thunderbird\rdwdst72.default-release"

Concernant les couleurs, je t'ai déjà fait apparaître que la copie simple du script texte ne ramène pas l'indispensable caractère d'échappement, tu ne dois pas servilement copier à défaut de pouvoir l'appeler au clavier par une syntaxe qui m'échappe:

echo ^[93mSAUVEGARDE THUNDERBIRD[0m

mais aller télécharger le lien indiqué en <59> et dont contenu texte enregistré sous color.cmd ou ce que l'on veut; je vais maintenant y copier seulement ce qui ressemble à ^[nnmblabla[0m (sans ce qu'il y avant que je supprimerai), le but étant de copier le caractère "rectangle" qui existe entre ^ et [ et entre blabla et [

Après, je copie-colle  au kilomètre cette syntaxe dans toutes les autres occurrences et je modifie seulement nn et blabla selon ce qui est pertinent.

Même si l'importance est secondaire pour l'exécution du script sans erreur de forme, tu ne peux pas non plus recopier servilement un masque d'exclusion -Exclude:*.txt ou /XF *.txt: je t'ai aussi fait apparaître que, dans ton cas de figure et si d'autres fichiers ne viennent pas à s'en mêler, l'extension pertinente n'était pas *.txt mais *.jsonlz4, voir en <61>: j'ai personnellement testé et comme tu l'as toi-même remarqué avec des photos jpg à la place des mails et des fichiers txt bidon (mais non vides) à la place des jsonlz4.

Une fois tout cela corrigé et si le problème persiste, je rappelle que la syntaxe ROBOCOPY reste simulée tant qu'on n'enlève pas /L (tant mieux tant qu'on n'a pas simulé tous les cas de figure sur, comme je l'ai aussi indiqué, les dossiers source et destination copiés chacun à un endroit bidon et bien sûr les chemins amendés en conséquence) de sorte à supprimer volontairement et alternativement quelques mails et les fichiers jsonlz4 de la destination pour vérifier ce qu'il se passe.

Enfin, concernant les valeurs de copie négative, j'ai au moins en simulation, mais pas de raison que cela se comporte différemment en réel, à tester, un rendu paradoxal de la commande ROBOCOPY (ce qu'il y a entre delims= et " est une tabulation par la touche adéquate)
 

FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%dest%" "%orig%" /L /XF *.txt /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS

où %dest% vers %orig% n'est curieusement pas un typo, les valeurs sont négatives pour l'inverse montrant que la copie s'effectue alors dans le mauvais sens, mais c'est un problème secondaire: on met l'un avant l'autre ou vice-versa jusqu'à constater en simulation que la taille %orig% est plus grande que %dest% (tout au moins quand on a viré des fichiers de la destination bidon) et la différence positive.

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

Je ne le fais pas, mais je devrais le faire comme tout le monde: l'usage sécurisé veut qu'on ne désigne pas une variable par un mon qui risque de la faire confondre avec un mot ou une commande (var, %var%, %%var) mais par un caractère improbable empêchant toute confusion (par exemple _var, %_var%, %%_var)

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

On y arrive...

Effectivement,  j'avais mangé le "dest=" en ligne 5 par un mauvais copier/collé... erratum !

Concernant la couleur de txt, c'est ce sacré "petit carré" qui manquait avant [93m et [0m qui encadrent le texte. Ce caractère (zéro sous Wingdings 2) n'apparaît pas sur ce forum, quelles que soient dans les options de langue de "insérer un extrait de code" choisies.

J'ai donc, moins "servilement" ;) remplacé *.txt par *.*.jsonlz4, mais il continue de m'afficher les lignes incriminées. Ceci dit, ce n'est pas trop grave car le reste du script fonctionne sacrément bien ! Merci

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

*.jsonlz4 et non *.*.jsonlz4.....

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

Je ne peux pas t'aider beaucoup sur ce point, je n'utilise pas Thunderbird, il faut ouvrir le fichier Profil pour voir la syntaxe.

Sous Firefox, ils s'appellent addonStartup.json.lz4, il y a un point entre json et lz4, et l'extension est un format de compression .lz4

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

Penses tu qu'il soit facile de fonctionner ainsi, plutot que retirer manuellement le /L de robocopy ?

0
jee pee Messages postés 40718 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 janvier 2025 9 505
22 mars 2023 à 12:04

Tu peux faire 2 scripts. Un verification.cmd et un sauvegarde.cmd

0
brucine Messages postés 18726 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805 > jee pee Messages postés 40718 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 janvier 2025
22 mars 2023 à 12:31

Bonjour,

On peut toujours en effet, mais le /L n'est destiné qu'à simuler l'opération tant qu'on n'a pas trouvé les paramètres appropriés: quand c'est fait, on l'enlève normalement définitivement.

Si on veut malgré avoir ôté ce commutateur un choix de faire la sauvegarde ou pas, la solution la plus simple consiste à entrer une syntaxe CHOICE avant "ECHO fichiers à copier" ou "ECHO Taille hors fichiers de configuration:", qui dirige sur la suite si O(ui) et si N(on) soit directement sur :END, soit par exemple sur une étiquette précédente :CONFIRM avec quelque chose du genre "ECHO Attention sortie sans sauvegarde!"

https://ss64.com/nt/choice.html

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

J'ai tenté de me débrouiller seul, avec ces quelques explications..

Mon commutateur CHOICE semble fonctionner. Si je répond N, la fenêtre se ferme, c'est ce que je voulais, mais si je répond O, ça bloque, la fenêtre se gèle. Les 2 commandes FOR /F %%a IN (' situées après ROBOCOPY, sensées me restituer des valeurs ne s'affichent pas..

Je n'ai que quelques vielles notions de basic, et le batch me parle peu, donc je cumule les erreurs sans le voir et le savoir... Help..

@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 "dest=G:\photos\antibes"

echo ^[93mSAUVEGARDE THUNDERBIRD[0m
echo:

:DIFF
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.jsonlz4| 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 -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
echo:

echo ^[31mDifférence = %diff1% octets[0m

echo:

@echo off
CHOICE /C ON /M "Proceder a la sauvegarde"
IF %ERRORLEVEL% EQU 1 GOTO COPY
IF %ERRORLEVEL% EQU 2 GOTO END

:COPY
ECHO Fichiers à copier:
ECHO ------------------
FOR /F "skip=1 tokens=1-5 delims=	" %%f IN ('ROBOCOPY "%orig%" "%dest%" /XF *.txt /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
ECHO --------------------------------------
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets

echo ^[32mSauvegarde effectuée le %date%[0m
echo:
pause

:PROCESS
ECHO %size% %name%
GOTO END


:NOCOPY
echo:
echo ^[32mIl n'y a pas de nouveau mail, pas de synchronisation[0m
echo:
pause

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

La syntaxe semble pourtant correcte, enlèves la ligne @echo off en 29 et écris plutôt:

CHOICE /C ON /M "Procéder à la sauvegarde O/N"

c'est plus clair.

Mais si la différence est nulle, la ligne 16 va t'amener directement à :NOCOPY en shuntant ta commande CHOICE.

Si on veut alors continuer à systématiquement ne pas faire une sauvegarde nulle, il faut couper-coller la ligne 16 en une nouvelle ligne insérée en 35.

Si ça continue à ne pas fonctionner, teste %ERRORLEVEL% en remplaçant les GOTO lignes 31 et 32 par respectivement ECHO toto et tata suivis d'une nouvelle ligne pause.

Si l'affichage est correct, s'assurer que les étiquettes sont bien dirigées en écrivant ces ECHO toto et tata suivis de pause juste en-dessous des lignes 34 et 57 et/ou fais une copie de la ligne 47 sous 38 suivie de pause pour vérifier la syntaxe ROBOCY.

Pense à modifier ton masque d'exclusion jslonlz4 selon la syntaxe exacte, probablement .lz4

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

Bonsoir,

Shunter la commande CHOICE en cas d'égalité me convient, car la demande de copie n'a plus d'utilité si la sauvegarde est à jour.

A vrai dire, la copie des json ne me dérange pas, au contraire, donc le filtre d'exclusion ne me servira pas. Le seul souci est que j'avoue ne pas savoir exactement quels caractères enlever pour virer ce filtre sans corrompre la syntaxe de la commande....

Lorsque j'enlève les lignes 39 et 40
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Sauvegarde = %%a octets
.. la copie fonctionne bien.

Je souhaiterais juste que s'affiche les tailles des 2 dossiers (orig+dest) pour, de visu, vérifier qu'elles sont identiques..

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

J'étais un peu à la bourre tout à l'heure, j'ai lu ton script en diagonale, l'erreur n'a rien à voir avec CHOICE ni les exclusions, mais avec un artefact de ROBOCOPY qui n'affiche via /L les fichiers à copier que de %dest% vers %orig% alors que la copie réelle ne s'effectue évidemment que de %orig% vers %dest%.

Le subterfuge consiste donc à mettre 2 lignes ROBOCOPY successives inversées, la première simulée, la deuxième réelle.

ATTENTION: la deuxième est réelle; si on veut tester le reste du script, on y met /L et on n'aura pas de copie, si on veut tester en temps réel sans prendre de risque, on fait une copie du script dans un autre dossier, on le renomme, on le coupe-colle à côté de l'autre.

On fait une copie du Profil Thunderbird dans un autre emplacement du disque, je ne vais pas me compliquer la vie, je copie seulement le dossier par exemple sur le bureau pour donner  C:\Users\xxx\Desktop\rdwdst72.default-release et je crée un dossier de destination bidon sur le bureau par exemple C:\Users\xxx\Desktop\test, je modifie bien sûr les 2 SET initiaux des dossiers en conséquence.

J'ai assumé que l'extension exclue était en fait .jsonlz4, je fais une copie quelconque d'un de mes fichiers txt non vides sur le bureau (ou j'en crée un dans lequel je rentre les 10 premières phrases qui me passent par la tête), je le renomme tartempion.jsonlz4 et je le copie dans ma source du bureau.

Si l'expérience n'est pas concluante (elle l'est chez moi) ou si je ne veux pas exclure, je supprime
-Exclude:*.jsonlz4 dans les commandes PowerShell et /XF *.jsonlz4 dans les commandes ROBOCOPY.

J'ai rajouté tout en bas une fioriture rouge de Sortie sans sauvegarde, il faut comme pour les autres copier une mise en forme correcte pour respecter les caractères d'échappement.

Nous avons donc les copies d'écran pour réponse Non et Oui quand il y a des différences et le script modifié en conséquence.

 

@echo off
CHCP 65001 >NUL

SET "orig=G:\photos\antibes"
SET "dest=C:\Users\brucine\Desktop\antibes"

echo ^[93mSAUVEGARDE THUNDERBIRD[0m

:DIFF
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %orig% -Recurse -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum"') DO SET to=%%a
FOR /F %%b IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.jsonlz4| 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 -Exclude:*.jsonlz4| Measure-Object -Property Length -Sum).Sum.ToString('N0')"') DO echo Source.... = %%a octets
FOR /F %%a IN ('powershell.exe -Command "(Get-ChildItem %dest% -Recurse -Exclude:*.jsonz4| 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 "%dest%" "%orig%" /L /XF *.jsonlz4 /MIR /NP /NJH /NDL /NFL /NJS') DO SET size=%%g & SET name=%%h &	CALL :PROCESS
echo:
ROBOCOPY "%orig%" "%dest%" /XF *.jsonlz4 /MIR /NP /NJH /NDL /NFL /NJS
echo ^[32mSauvegarde effectuée le %date%[0m
echo:
pause

:PROCESS
ECHO %size% %name%
GOTO END

:NOCOPY
echo:
echo ^[32mIl n'y a pas de nouveau mail, pas de synchronisation[0m
echo:
pause
GOTO END

:QUIT
echo:
echo ^[31mSortie sans sauvegarde[0m
echo:
pause

:END
0
brucine Messages postés 18726 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025 2 805 > brucine Messages postés 18726 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 24 janvier 2025
23 mars 2023 à 00:46

Si je veux l'affichage des tailles source et destination et de la différence même quand elle est nulle, tous les goûts sont dans la nature, je coupe la ligne 14 que je place ligne 24.

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

J'en reviens aux fichiers de configuration.

Je ne sais pas si la sauvegarde en est utile; je ne sais pas s'ils ne sont pas recréés automatiquement ni s'il ne suffit pas, en cas de crash, de réinstaller Thunderbird ou pas et d'écraser les mails de la source par ceux de la sauvegarde.

Dans le doute, on va assumer que oui et qu'il faut les sauvegarder dans la seule ligne de copie réelle et donc enlever le paramètre d'exclusion ligne 37:

ROBOCOPY "%orig%" "%dest%" /MIR /NP /NJH /NDL /NFL /NJS
Par contre, ne pas les maintenir pour le calcul de la différence n'est pas une bonne idée:
comme ils changent à chaque ouverture de session, elle ne sera jamais nulle et on n'ira donc
jamais à NOCOPY.

Il faut donc en identifier la syntaxe, *.jsonlz4 devrait suffire, mais on peut toujours
avoir un doute du fait des doubles extensions style:

1675442042500.4a24979c-854e-4318-893c-4884c79ffdc6.new-profile.jsonlz4
Dans ce cas de figure, tester dans une ligne de commande séparée jusqu'à obtenir
le bon résultat.

Tu vas te rendre dans le dossier rendu par ta copie d'écran en <69> et te placer sur
n'importe lequel de ces fichiers lz4, clic droit, propriétés, copier tout ce qui se trouve
dans "Emplacement" dans le batch qui suit à la place de "test":

@echo off
CD /D test
dir *lz4
pause
Chez moi, ça fonctionne en se contentant de *lz4, tester si la commande dir ne ramène rien
par *.lz4en remplaçant *jsonlz4, *.jsonlz4 ou en faisant précéder tout cela de *.
jusqu'à ce qu'il y ait une sortie
(tenir compte de la double extension précédente, voir ma deuxième copie d'écran ci-dessus).*.

Noter que ces fichiers jsonlz4 sont majoritairement sinon tous placés dans le dossier
datareporting: ils ne représentent donc que de la télémétrie, l'oeil de Moscou à destination
de Mozilla.

Si je suis fâché avec l'exclusion par fichiers du style /XF *.jsonlz4 dans ROBOCOPY je peux
la remplacer par /XD (chemin du dossier datareporting) mais dans PowerShell une syntaxe -Exclude:(dossier) au lieu de -Exclude:(fichier) exclut
des noms désignés, pas des chemins.

Il n'y a pas de solution simple, je reviens si j'en trouve une capillotractée et que
l'exclusion par fichier ne suffit pas.
0