quelques problèmes...

Le
Lotre
Bonsoir,

Histoire de vérifier que j'avais à peu près compris certaines choses,
j'ai réalisé une petite procédure à incorporer dans un batch pour
récupérer la taille, le nb de fichiers et de sous-dossiers d'un
répertoire :
voilà ce que ça donne plus bas
( on transmet à la procédure le chemin du répertoire et les noms des
variables à remplir)

Mes premiers tests semblaient nickels mais soudain
j'ai vu des pb
J'ai mis un instant à comprendre :

1. La taille totale en octets donnée par DIR /S ( avant-dernière
ligne)
peut dépasser le fatidique 2 147 483 647
et alors set /a échoue

Je pourrais bien sûr, emporté par cet élan, mettre au point
des procédure de calculs en "haute précision" en reprogrammant
mais si vous avez une idée moins brutale, je suis client.

2. Le nb de répertoires indiqué par la dernière ligne de DIR /S
est bidon car les . et .. présents à chaque niveau sont comptés.
Il faudrait trouver une formule qui donnera le bon nb de répertoires
en fonction du nombre annoncé
Si qqun en connait une, ça m'évitera d'y réfléchir ;o)
Ma conjecture est :
NBREEL= ( NBANNONCE - 2 )/3

mais peut-être les différentes combinaisons font qu'une formule est
impossible ?
Auquel cas il faudra faire une nouvelle boucle for
avec une variable compteur ( merci !Machin! )
qui compte les <REP> qui ne sont ni "." ni ".."


3. Par ailleurs, j'ai noté que le nb d'octets obtenu via DIR /S
diffère parfois très sensiblement du nb d'octets
obtenu par "clic droit > propriétés"
est-ce grave docteur ?

Bien amicalement,
HB

=
SCRIPT
Bien sûr les lignes avec FOR sont longues
et finissent à la parenthèse ouvrante après le DO
=

Set REP=F:Temp
Call :ANALYSEREP "%REP%" "T" "N" "R"
@CLS
@Echo La taille de %REP% est d'environ %T% Mo
@Echo %REP% contient %N% fichiers.
@Echo %REP% contient %R% r,pertoires.
@Echo.
@Pause
:: Suite du code
GOTO :LAFIN
:: ==
:ANALYSEREP
for /F "tokens=1,3 delims= " %%a in ('dir /S /-C "%~1" 2^>nul ^|
findstr /E /L "octets" ') do (
set TAILLE=%%b
Set NBF=%%a
)
for /F "tokens=1 delims= " %%a in ('dir /S /-C "%~1" 2^>nul ^| findstr
/E /L "octets libres" ') do (
set NBR=%%a
)
set /a TKO=%TAILLE%/1024
set /a TMO0*%TKO%/1024
set %~2=%TMO:~0,-2%,%TMO:~-2%
set %~3=%NBF%
set %~4=%NBR%
set TMO=
Set TKO=
Set TAILLE=
Set NBF=
Set NBR=
goto :eof
:: ==
:LAFIN
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles LAURENT [MVP]
Le #18304951
"Lotre" wrote:

Bonsoir,



Bonjour,

[...]
Mes premiers tests semblaient nickels mais soudain ...
j'ai vu des pb...
J'ai mis un instant à comprendre :


[...]

Les limites du batch malheureusement. Il existe toutefois des moyens de
contournements à vos problèmes en revanche je pense que l'utilisation d'un
langage plus évolué tel que VBScript ou PowerShell serait préférable et
surtout plus adapté à ce genre de chose.

1- Pour le set/a, il faudrait construire une valeur 64bits (soit deux 32bits
signés)
2- Pour le nombre réel de dossier, la formule semble correcte
3- Normalement non (taille et non taille sur le disque)

Ci-dessous la version VBScript :

--- GetFolderInfo.vbs ---
Const sRootFolder="D:Test"
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oRootFolder=oFs.GetFolder(sRootFolder)
nFileCount=0: nFolderCount=0

GetSubFolders oRootFolder

WScript.Echo sRootFolder
WScript.Echo FormatNumber(oRootFolder.Size,0) & " octets"
WScript.Echo nFileCount & " Fichiers, " & nFolderCount & " Dossiers"

Sub GetSubFolders(oFolder)
nFileCount=nFileCount+oFolder.Files.Count
For Each oSubFolder in oFolder.SubFolders
nFolderCount=nFolderCount+1
GetSubFolders oSubFolder
Next
End Sub
--- GetFolderInfo.vbs ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Gilles LAURENT [MVP]
Le #18305321
Bonjour,

Et la version PowerShell :

$content=dir D:Test -r
"$(($content | measure-object -prop length -sum).sum) octets"
"$(($content | where {!$_.PSIsContainer}).count) Fichiers"
"$(($content | where {$_.PSIsContainer}).count) Dossiers"

AMHA, il est préférable d'investir dans PowerShell. C'est le langage
d'avenir dédié à l'administration des plateformes Windows. VBScript a encore
de bons jours devant lui ... mais avec l'arrivée de Windows 7, la donne
risque de changer, PowerShell étant maintenant intégré au système
d'exploitation tout comme dans Windows Server 2008 ! Encore faut-il être en
mesure de migrer son parc ;-)

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Méta-MCI \(MVP\)
Le #18307121
Bonjour !

Je suis en clientèle, et assez occupé.
Mais, je prends une minute pour répondre.
D'abord, Gilles Laurent a raison de souligner les limites des batchs. On
passe souvent beaucoup de temps à les contourner.
Ensuite, pour afficher les tailles sans séparateurs de milliers, DIR est
équipé de l'options /-C ; sous mon Vista favori, cela fonctionne bien.
Pour compter les répertoires, j'utilise Robocopy :
robocopy %cd% C: /IA:R /S /E /L /NFL /NJH /NDL
(le /L empêche la copie de se faire, elle est simulée, et seule la
liste est affichée)

@-salutations
--
Michel Claveau
Gilles LAURENT [MVP]
Le #18364761
"Lotre" news:%
| Bonsoir,

Bonsoir,

[...]
| 1. La taille totale en octets donnée par DIR /S ( avant-dernière
| ligne)
| peut dépasser le fatidique 2 147 483 647
| et alors set /a échoue ...
[...]

Je viens concevoir l'outil DynSetEnv (support des pipes, arithmétique
sur 64 bits et propagation dynamique des variables dans les
environnements des processus parents). L'article se situe ici :
http://glsft.free.fr/index.php?option=com_content&task=view&idg&Itemid(

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Lotre
Le #18364831
Gilles LAURENT [MVP] wrote:
"Lotre" news:%
Bonsoir,



[...]

Je viens concevoir l'outil DynSetEnv (support des pipes,
arithmétique
sur 64 bits et propagation dynamique des variables dans les
environnements des processus parents). L'article se situe ici :
http://glsft.free.fr/index.php?option=com_content&task=view&idg&Itemid(




Mazette,

je vais regarder cet outil qui m'a l'air bien beau

A+

HB
Publicité
Poster une réponse
Anonyme