Batch : Récupère la taille des différents dossiers

Fermé
BenjaminA2mains Messages postés 43 Date d'inscription dimanche 1 août 2021 Statut Membre Dernière intervention 5 février 2023 - Modifié le 8 oct. 2022 à 22:30
brucine Messages postés 17840 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 23 novembre 2024 - 9 oct. 2022 à 12:23

Bonjour,

J'ai davantage une question qu'un problème.

Voilà, j'ai ce script en batch qui m'affiche en octets / Ko / Mo / Go la taille des différents dossiers du dossier dans lequel le script s'exécute.

Donc pour cela, j'ai ce petit script :

FOR /D %%d IN (*) DO (
    FOR /R "." %%s IN (*) DO (
        SET /A size+=%%~zs
    )
    SET doss=%%~nd
)
ECHO %doss% : %size% o
SET /A size_ko=%size%/1024
ECHO %doss% : ~%size_ko% Ko
SET /A size_mo=%size_ko%/1024
ECHO %doss% : ~%size_mo% Mo
SET /A size_go=%size_mo%/1024
ECHO %doss% : ~%size_go% Go

Ce petit script fonctionne très bien, mais (oui parce qu'il faut toujours quelque chose qui ne va pas) il ne m'affiche pas la bonne taille…

Il analyse actuellement un dossier ~78 Go (je m'en fous que le script soit rapide ou pas, j'ai tout mon temps) mais affiche que j'ai seulement ~838 Mo. Si quelqu'un à une idée du pourquoi du comment.

Je précise que les différents dossiers sont remplis que d'image au format PNG et sont rangés nommé ainsi : frame_%num.png.

Est-ce que les analyses de fichiers / dossiers sont limités en taille pour éviter d'éventuelles tâches beaucoup trop longues où sont justes tout simplement limités par une quantité maximale de fichiers différents par dossiers ?

1 réponse

barnabe0057 Messages postés 14452 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 3 août 2024 4 917
Modifié le 9 oct. 2022 à 02:24

Bonjour,

Pour résoudre le problème, je dirais qu'il faut "retarder" la variable size comme ceci :

setlocal enabledelayedexpansion
FOR /D %%d IN (*) DO (
    FOR /R "." %%s IN (*) DO (
        SET /A size+=%%~zs
    )
    SET doss=%%~nd
)
ECHO !doss! : !size! o
SET /A size_ko=!size!/1024
ECHO !doss! : ~%size_ko% Ko
SET /A size_mo=%size_ko%/1024
ECHO !doss! : ~%size_mo% Mo
SET /A size_go=%size_mo%/1024
ECHO !doss! : ~%size_go% Go

-

Tu pourrais aussi simplifier le script comme ceci :

setlocal enabledelayedexpansion
FOR /R "." %%s IN (*) DO SET /A size+=%%~zs

ECHO !CD! : %size% o
SET /A size_ko=%size%/1024
ECHO !CD! : ~%size_ko% Ko
SET /A size_mo=%size_ko%/1024
ECHO !CD! : ~%size_mo% Mo
SET /A size_go=%size_mo%/1024
ECHO !CD! : ~%size_go% Go


2
brucine Messages postés 17840 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 23 novembre 2024 2 602
9 oct. 2022 à 07:27

Bonjour,

Ne pas oublier qu'en cas d'un dossier de plus de 2 Go on va se faire planter par la limite de calcul à 2^31.

On doit alors avant le calcul limiter l'affichage de la taille en octets à 9 chiffres:

SET/A "SIZE9=%SIZE:~0,9%"

Si je veux pinailler à l'extrême et afficher le nombre avec des décimales, il va falloir en outre que je teste la longueur de la chaîne en octets pour appliquer le bon format de sortie après division selon par exemple qu'on est dans la tranche 1 à 10, 10 à 99 ou 100 à 999 Mo.
 

-4
brucine Messages postés 17840 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 23 novembre 2024 2 602 > brucine Messages postés 17840 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 23 novembre 2024
9 oct. 2022 à 12:23

Pour ceux qui ne sont pas d'accord, essayez au hasard avec un dossier de 5,50 Go:
 

H:\archives\10>SET /A size+=5910536192
Nombre non valide. Les nombres sont limités à une précision de 32 bits

que je n'aurai a fortiori aucun moyen de diviser par 1024

-1