Basé sur quoi ? Bash va juste appeler des commandes écrites en C, il va être très rapide sur ce genre de tâche comme tout autre langage de scripting parce que c'est les entrée-sorties qui prennent du temps.
Je vais tester..
Merci !
Testé ! merci
HashMyFiles v2.43 me retourne effectivement l'empreinte numérique des fichiers et leur intégrité, mais je souhaite juste retrancher les valeurs size1 et size2 pour qu'il me donne la différence en octets.
La valeur de cette différence (size1-size2=) me suffirait amplement.
Malheureusement, ça ne marche pas mieux...
Pour plus de clarté, voici mon script complet.
J'y ai ajouté la demande d'affichage du résultat, avec séparateur de milliers, dans une fenêtre windows :
Voici la fenêtre obtenue, et dessous, la fenêtre que je souhaiterais obtenir :Code: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
Du coup c'est un problème d'afficher la 3ème ligne ou de faire le calcul de la différence ?
ça devrait fonctionnerCode:set /a diff = size1-size2 ... echo MsgBox "Taille source (C:) : " ^& FormatNumber(!formatted_size1!, 0, True) ^& " octets" ^& vbCrLf ^& "Taille cible (D:) : " ^& FormatNumber(!formatted_size2!, 0, True) ^& " octets" ^& vbCrLf ^& "Différence: " ^& Format(!diff!,0,True) ^& " octets", vbOKOnly, "Resultat du backup" > %temp%\temp.vbs
Il me semble avoir inséré les lignes au bon endroit, mais le résultat obtenu est :
j'ai mis Format au lieu de FormatNumber sur la ligne du MessageBox, my bad; donc faire le remplacement du nom de la fonction.
Bonjour.
Concernant l'efficacité défaillante de ChatGPT dans le domaine de l'informatique (il cause il cause mais comme pour certains ça ne fournit rien de concret ) il faut savoir que lorsque vous engagez une "nouvelle" session sur le site de ChatGPT, elle n'est pas vierge.
Les concepteurs ont de base demandé à l'IA de se comporter comme un Bot "qui tchate", ce qui en fait un beau parleur certes mais alors qu'il pourrait être plus technique il ne se tient pas à son rôle.
Mais quel rôle au fait ?
Il faut bien qu'il choisisse parmi plusieurs possibilités, donc du coup, une fois il fait un truc bien (en informatique) et une autre fois c'est n'importe quoi.
Il faut donc EFFACER la demande des concepteurs, lui demander d'oublier ce qui lui a été dit "avant" le démarrage de la session. Et aussi lui demander de se comporter comme un programmeur sénior avec 15 ans d'expérience.
On a donc "la phrase magique" à mettre en préambule de toute discussion avec ChatGPT, expliquée ici :
https://www.youtube.com/watch?v=rnDbi8gti0U
Dernière modification par ArchoZaure ; 13/03/2023 à 19h37.
@umfred
Merci
Ca marche mais le calcul est incorrect...
Voici le script complet avec modifs pour + de clarté :
Code:@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!" set /a diff = size1-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" ^& vbCrLf ^& "Différence: " ^& FormatNumber(!diff!,0,True) ^& " octets", vbOKOnly, "Resultat du backup" > %temp%\temp.vbs start /wait %temp%\temp.vbs del %temp%\temp.vbs exit
@ArchoZaure
Bonjour. Je teste CHATGPT depuis 1 bon moment. Beaucoup à en dire...
J'ai même tenté de le faire "dessiner". Voici mon message :
Bonjour. Je souhaite dessiner une croix verticale de 2 cm de hauteur. Voici la règle : le code "1N" = déplacer le crayon d'un centimètre vers le NORD en traçant une ligne , le code "1O" = déplacer le crayon d'un centimètre vers l'OUEST en traçant une ligne , "3E" = déplacer le crayon de 3cm vers l'EST en traçant une ligne , et ainsi de suite... Si un "R "précède le code de déplacement, le crayon se déplace sans tracer de ligne. Donc le code "R1N" = déplacer le crayon d'un centimètre vers le NORD sans tracer de ligne, "R2S" = déplacer le crayon de 2cm vers le SUD sans tracer de ligne, et ainsi de suite... La position du crayon est toujours relative à sa dernière position. Objectif : dessiner une croix verticale à 4 branches, mesurant chacune 1cm. Quel suite de codes y parvient ?
Il indique avoir bien compris la règle et l'objectif, mais répète sans cesse ses erreurs. Et moi qui souhaitais lui faire dessiner une forme globale de visage avec 2 yeux, un nez et une bouche....
Il y aurait beaucoup à dire sur cette IA, mais comme ce n'est pas le sujet de la discussion, je ne vais continuer à en parler ici.
Merci pour ton astuce très efficace.
chez moi ton code fonctionne
je l'ai lancé depuis une invite de commande ouvert en tant qu'administrateur (ou via un clic droit "Executer en tant qu'administrateur"
Bonjour,
Mon script est identique à celui posté plus haut, à la virgule près.
Le batch lancé en admin me restitue toujours la fenêtre postée plus haut.
D'ou pourrait venir le problème ? La racine qui diffère ?
et depuis cmd.exe en admin :
Dernière modification par bibi2223 ; 15/03/2023 à 11h22.
là ça te signale une erreur de syntaxe dans le vbs généré, au niveau du 47ème caractère, étrange.
Sinon j'avais testé avec 2 répertoires sur le même lecteur et 2 répertoires sur des lecteurs différents, et dans les 2 cas, cela a fonctionné chez moi.
Tu as fait l'essai avec 2 répertoires de C: par exemple ?
La seule différence qu'il peut y avoir, sont les modifs que tu dis avoir faites pour plus de clarté quand tu as mis ton dernier code
Voici le script
et voici la fenêtre qui résulte de son exécutionCode:@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!" set /a diff = size1-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" ^& vbCrLf ^& "Différence: " ^& FormatNumber(!diff!,0,True) ^& " octets", vbOKOnly, "Resultat du backup" > %temp%\temp.vbs start /wait %temp%\temp.vbs del %temp%\temp.vbs exit
Je ne comprends pas d'ou vient ce souci de calcul....
Je devrais avoir Différence: 1 138 504 octets
Dernière modification par bibi2223 ; 15/03/2023 à 15h21.
de nouveau ça fonctionne chez moi en copiant/collant ton code dans un nouveau fichier .bat
Essai de remonter le setlocal juste après le @echo off du début
C'est fait.
Ca ne change malheureusement rien..
C'est dommage, on y était presque.
Serait-ce la syntaxe de "set /a diff = size1-size2" ?
J'ai tenté en supprimant les espaces avant et après le = mais ça ne change rien...
Dernière modification par bibi2223 ; 15/03/2023 à 20h02.
En faisant des tests supplémentaires, sur des dossiers plus gros que lors de mes tests, j'avais des erreurs de calculs de la différence. Donc, j'en suis arrivé à la conclusion que les valeurs étaient trop grosses pour être converties correctement en valeur.
Ce qui se vérifie en saisissant l'opération directement dans l'invite de commande:
Donc j'ai fait l'opération dans le script vbs en remplaçant !diff! par !size1!-!size2!Code:c:\>set /a t=3559838215-2060582111 Nombre non valide. Les nombres sont limités à une précision de 32 bits
Si tu as besoin de la valeur dans le batch, il faudra diviser les valeurs par 10, 100, 1000 dans des variables et faire les opérations mathématiques nécessairesCode:echo MsgBox "Taille source (C:) : " ^& FormatNumber(!formatted_size1!, 0, True) ^& " octets" ^& vbCrLf ^& "Taille cible (D:) : " ^& FormatNumber(!formatted_size2!, 0, True) ^& " octets" ^& vbCrLf ^& "Différence: " ^& FormatNumber(!size1!-!size2!,0,True) ^& " octets", vbOKOnly, "Resultat du backup" > %temp%\temp.vbs
https://stackoverflow.com/questions/...s-of-precision
Ou de tout faire dans un script vbs directement (vu que tu utilises vbs ici pour la messagebox) (ou un autre langage)
Tu es un chef @umfred !!!
Tout fonctionne parfaitement à présent, sans recourir à une conversion quelconque car la différence est très bien calculée.
Alors un grand merci d'avoir eu la patience de te pencher sur ce petit batch qui va appuyer ma décision de faire ou non une sauvegarde.
Ce même batch peut servir à quiconque cherche une formule rapide et facile (sans soft de backup) pour vérifier si une copie est ok..
Génial et encore MERCI !
Dernière modification par bibi2223 ; 16/03/2023 à 18h19.
Comme je le suggérais, un script uniquement en vbs peut aussi faire le job (avec peut-être moins de lignes)
Le formatage de l'affichage (séparation des milliers) se faisant via un paramètre de FormatNumber (ce qui aurait aussi pu être fait dans le .bat)Code:dim fso, foldername1, foldername2, objfolder, size1, size2, diff foldername1="C:\temp" foldername2="P:\Projets" set fso=CreateObject("Scripting.FileSystemObject") if fso.FolderExists(foldername1) Then size1=fso.Getfolder(foldername1).size if fso.FolderExists(foldername2) Then size2=fso.Getfolder(foldername2).size diff=size1-size2 MsgBox "Taille source (C:) : " & FormatNumber(size1, 0, True,,True) & " octets" & vbCrLf & "Taille cible (D:) : " & FormatNumber(size2, 0, True,,True) & " octets" & vbCrLf & "Différence: " & FormatNumber(diff,0,True,,True) & " octets", vbOKOnly, "Resultat du backup"
J'ai laissé le calcul en dehors de la messagebox pour montrer que ça fonctionne sans souci ici
Dernière modification par Jack ; 16/03/2023 à 18h58. Motif: à la demande du rédacteur
Bon, t'as le bon nombre d'octets, comment tu es sûr que ce sont les bins au bon endroit?
Question subsidiaire: quid des droits sur les fichiers?
Jusqu'ici tout va bien...
dans se démarche, il a les droits sur les répertoires puisque qu'il veut en faire la sauvegarde (après on peut complexifier à l'envie si on veut)
ou utiliser un outil disponible (libre) qui fait le job (avec plein d'options additionnelles)...
Jusqu'ici tout va bien...
Tu es fou ? J'ai laissé entendre ça dès le début mais visiblement passer 10 jours et des page à utiliser un langage inadapté, une approche inadaptée, avec des specs en partie impossibles pour réinventer la roue mais carrée ou au mieux octogonale semble être l'approche préférée du forum informatique en ce moment.
@pm42 tu n'as pas vraiment proposé de solution alternative
En logiciel qui tourne bien pour comparer des répertoires, j'utilise WinMerge https://winmerge.org/downloads/?lang=fr
ça te compare les arborescences et t'indique les différences au niveau des fichiers
Non, quand les gens me prennent de haut et m'expliquent mon domaine d'expertise, je suis curieusement moins motivé.
Il y a aussi le fait que parfois, je pense que c'est bien qu'ils fassent des recherche Google/Bing/DuckDuckGo pour découvrir que la roue existe au lieu d'essayer d'en tailler une en calcaire avec des silex.
@pm42
Si tu n'as pas d'autre objectif que de critiquer en permanence les réponses des autres internautes sans chercher à aider la demande postée, je te suggère d'aller faire état de tes hautes connaissances dans d'autres discussions. Ton insistance ridicule sent la hargne puérile.
Umfred ayant résolu ma demande, je le remercie à nouveau, quite ce fil, et te laisse déblatérer à sasiété si c'est ton seul plaisir.