Script batch incorrect :(
brucine Messages postés 8611 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 mars 2023 - 24 mars 2023 à 11:35
- Script batch incorrect :(
- Script vidéo youtube - Guide
- Echo off batch ✓ - Forum Autoit / batch
- Fichier batch - Guide
- Script batch utile ✓ - Forum Programmation
- Captcha incorrect ✓ - Forum Internet / Réseaux sociaux
48 réponses
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 ?
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
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
23 mars 2023 à 16:58
23 mars 2023 à 17:05
Je t'ai répondu ci-dessus.
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/
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question23 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....
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 ?
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
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.
24 mars 2023 à 10:10
Remplace la ligne 24 par:
echo ^[32mDifférence = %diff1% octets[0m & GOTO QUIT
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 !!
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".
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.



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