VBS- Traiter fichiers dans un répertoire

Résolu
winzip -  
 Bernie_liege -
Bonjour,

VBScript : Traiter chaque fichier dans un répertoire ? Assez complexe - Help

Bonjour à tous,

Etant debutant et n'ayant pas vraiment trouvé une réponse en cherchant, je vous pose la question :

J'ai plusieurs fichiers log qui contiennent les données de backup de chaque utilisateurs : il contient la date, la taille du backup, le nombre de fois....
La taille du backup dans le fichier est délimitée par des "< >". Par exemple < 700.450>
J'ai commencé par traité un seul fichier pour m'entrainer.
J'effectue une recherche dans le texte et j'arrive à saisir la valeur située entre les <> avec ce code :

Code :

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("H:\Backup\user1-Backup.log")

Do Until objFile.AtEndOfStream
strData = ""
strSearchString = objFile.ReadLine

intStart = InStr(strSearchString, "<")

If intStart <> 0 Then
intStart = intStart + 2
strText = Mid(strSearchString, intStart, 250)

For i = 1 to Len(strText)
If Mid(strText, i, 1) = ">" Then
Exit For
Else
strData = strData & Mid(strText, i, 1)

End If
Next

Le résultat de cette opération est stocké dans un fichier texte. ( Est ce la bonne méthode ? ou faut-il stocker temporairement en mémoire ? )
Jusque là je me débrouilles péniblement.
Mais là ou je bloque c'est que je dois effectuer ces opérations sur tous les fichiers présents dans un répertoire et je ne sais vraiment pas comme faire ?

Je dois faire aussi le total de la taille des backup présents dans chaque fichier et placer le résultat dans un fichier texte unique pour les statistiques mais je galère vraiment...
ça veut dire que dois effectuer le premier code en haut pour chaque fichier, faut-il créer une fonction ou un sub pour ce code et l'appeler dans la boucle FOR...EACH ? J'ai vraiment du mal à coder...
Peut-on stocker le résultat de chaque fichier dans une variable ou plusieurs variables et les mettre ensuite dans un fichier unique , je deviens fou, cela fait 3 jours que je galère , je désespere vraiment..

Tous ce que je sais :

Code :

Set oFSO = CreateObject("Scripting.FileSystemObject")
stRep = Dossier
For Each oFl In oFSO.GetFolder(stRep).Files
................
LE CODE POUR 1 FICHIER
................
Loop

Excusez moi s'il y a des fautes ou si je ne suis pas clair, il est 3h30 du mat et je me casse la tete sur le code. En plus ça doit etre fonctionnel pour la fin de la semaine sinon le chef ne va pas être content...

PLEASE AIDEZ MOI SVP
Configuration: Windows XP
Firefox 2.0.0.7

22 réponses

  • 1
  • 2
  1. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    Salut,

    Laisse moi un peu de temps que j'me remette en tête le VBS et j'te dis ça... ;)

    PS : il est 11h20, j'viens de me lever donc j'ai aussi la tête en vrac... :)
    0
  2. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    Alors, peux tu me donner un exemple de la structure d'un fichier log stp ? (savoir s'il y a plusieurs sauvegardes enregistrées sur le même fichier, donc plusieurs chaines <...> à rechercher ou une seule...etc...)
    Euh... je sais pas lequel des deux a le cerveau le plus embrouillé, mais j'ai pas tout compris la finalité du script... Peux tu me redire précisement (avec des exemples si besoin) ce que tu veux ?
    Et dois tu parcourir tous les fichiers d'UN répertoire (backup) ou le faire de façon récursive dans une arborescence ?
    0
  3. winzip Messages postés 10 Statut Membre
     
    Merci teteve de me répondre .

    Je résume : J'ai un folder qui contient des logs. Je dois <gras>parcourir chaque log situé dans ce folder et extraire des informations que je dois stocker dans un seul fichier</gras> qui servira de statistique : il contiendra la somme de tous les backups, la fréquence des backups....

    Voici le contenu d'un fichier backup (h:\Backup\user1-backup.log :

    ************************************************************************************************************************
    Backup date: <27/06/2007 16:41:54>

    Total size of the backup : <<678.692 Mb>>

    ************************************************************************************************************************

    ************************************************************************************************************************
    Backup date: <13/07/2007 10:59:31>

    Total size of the backup : <<696.333 Mb>>

    ************************************************************************************************************************

    ************************************************************************************************************************
    Backup date: <24/08/2007 12:15:16>

    Total size of the backup : <<710.514 Mb>>

    ************************************************************************************************************************

    ************************************************************************************************************************
    Backup date: <14/09/2007 17:45:27>

    Total size of the backup : <<747.748 Mb>>

    ************************************************************************************************************************

    ************************************************************************************************************************
    Backup date: <19/09/2007 18:08:55>

    Total size of the backup : <<755.377 Mb>>

    ************************************************************************************************************************

    Comme tu peux le voir on a la date et la taille du backup.
    Je dois aller extraire dans chaque fichier la valeur située entre les "< >" et les "<< >>"
    Donc pour la taille totale, je dois prendre la dernière valeur dans chaque fichier et les additionner

    Si tu as besoin de plus de précisions n'hésites pas . MERCI ENCORE !!!
    0
  4. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objRep = objFSO.GetFolder("H:\Backup")

    For Each file In objRep

    Set objFile = objFSO.OpenTextFile(file)

    Do Until objFile.AtEndOfStream

    strData = ""
    strSearchString = objFile.ReadLine
    intStart = InStr(strSearchString, "<")
    If intStart <> 0 Then
    intStart = intStart + 2
    strText = Mid(strSearchString, intStart, 250)
    For i = 1 To Len(strText)
    If Mid(strText, i, 1) = ">" Then
    Exit For
    Else
    strData = strData & Mid(strText, i, 1)
    End If
    Next
    Set objFile = Nothing
    End if
    Next

    (j'ai laissé tel quel ton analyse de chaine...)

    voilà déjà pour parcourir tous les fichiers...
    Par contre je n'ai toujours pas compris comment tu veux ressortir tes données... créer un seul fichier avec :
    date taille
    date taille
    date taille
    ...

    Ou un fichier avec toutes les dernières tailles des sauvegardes ?
    taille_user1
    taille_user2
    taille_user3
    ...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. winzip Messages postés 10 Statut Membre
     
    Merci teteve pour ta rapidité !! je test ça...

    Il faudrait un seul fichier qui contient la somme de tous les derniers backup effectué

    Donc :

    taille dernier backup-user1 + tailler dernier backup-user2 + ........

    Tu vois ce que je veux dire ? N'hésites pas s'il te faut plus d'explications
    0
  7. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    J'regarde ça, j'viens enfin de retrouver la fonction qui me manquait... :)
    (j'ai laissé toutes mes docs au boulot...)
    0
  8. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    en premier jet, voici ce que je te propose... A toi de le modifier après si besoin, ou de demander si tu ne comprends pas un passage...

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFiles = objFSO.GetFolder("H:\Backup").Files

    dbleCompteur = 0
    For Each file In objFiles
    strFile = objFSO.OpenTextFile(file).ReadAll
    IntStart = InStrRev(strFile, "<<") + 2
    IntStop = InStrRev(strFile, ">>") - 4
    IntLong = IntStop - IntStart
    If IntStart <> 0 Then
    strData = Replace(Mid(strFile, IntStart + 2, IntLong), ".", ",")
    End If
    dbleCompteur = dbleCompteur + CSng(strData)
    Set strFile = Nothing
    Next

    ' Tu as ta variable dbleCompteur qui contient la taille de toutes les dernières archives...
    ' L'écrire dans un fichier, dans une cellule Excel....

    Cela correspond à tes attentes ?

    PS : petit inconvénient de cette méthode, c'est que je charge tout le contenu du fichier texte dans la variable strFile.
    A éviter en cas de gros fichiers, refaire une boucle sur chaque ligne (ou juste sur les premières en partant de la fin...)
    0
  9. winzip Messages postés 10 Statut Membre
     
    Ok merci pour le code recherche entre les tags <<>>
    MAintenant faut que je le fasse pour chaque fichier et ensuite additionner le résultat trouver dans chaque fichier. Au final je dois avoir la somme. La ou je cale c'est comment prendre le résultat trouvé dans chaque fichier , additionner le tout et le placer dans un fichier texte
    Si tu pouvais m'aider..... PLZ
    0
  10. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    regarde bien le code... c'est déjà fait...

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFiles = objFSO.GetFolder("H:\Backup").Files ' Je récupère l'objet "ensemble des fichiers du répertoire Backup"

    dbleCompteur = 0 ' J'initialise le compteur (correspond au total des backups)
    For Each file In objFiles ' Pour chaque fichier, je fais :
    strFile = objFSO.OpenTextFile(file).ReadAll ' - j'ouvre le fichier, je le lis et je place le contenu dans la variable strFile
    IntStart = InStrRev(strFile, "<<") + 2
    IntStop = InStrRev(strFile, ">>") - 4 ' - je fais ma recherche pour avoir le dernier chiffre placé entre "<< >>"
    IntLong = IntStop - IntStart
    If IntStart <> 0 Then
    strData = Replace(Mid(strFile, IntStart + 2, IntLong), ".", ",") ' je récupère le chiffre de taille (et j'remplace le "." par "," au passage)
    End If
    dbleCompteur = dbleCompteur + CSng(strData) ' j'additionne la taille trouvée (la dernière sauvegarde) au compteur global, donc = 0 au début, puis augmente au fur et à mesure
    strFile = Nothing
    Next ' Fin du traitement du premier fichier, je recommence avec le deuxième...etc...

    A la fin de ta boucle, dbleCompteur a pour valeur la taille totale des sauvegardes... à toi d'en faire ce que tu veux... (l'écrire dans un fichier avec d'autre texte, dans un tableau excel...etc...)
    0
  11. winzip Messages postés 10 Statut Membre
     
    AH ouais super teteve, je ne l'imaginais pas comme ça.
    Je test mais j'ai une erreur : Type mismatch: 'CSng'
    Merci pour ta patience
    0
  12. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    ah vi, je m'a planté... :-S

    correction :

    au lieu de :

    IntStart = InStrRev(strFile, "<<") + 2
    IntStop = InStrRev(strFile, ">>") - 4
    IntLong = IntStop - IntStart
    If IntStart <> 0 Then
    strData = Replace(Mid(strFile, IntStart + 2, IntLong), ".", ",")
    End If

    mettre :

    IntStart = InStrRev(strFile, "<<") +2
    IntStop = InStrRev(strFile, ">>") - 3
    If IntStart <> 0 Then
    strData = Trim(Replace(Mid(strFile, IntStart, IntStop - IntStart), ".", ","))
    End If

    explications : j'ai supprimé IntLong qui n'apporte rien à part une variable en plus... Mais j'ai rajouté Trim "à priori inutile" juste pour en parler... :)) Il permet de supprimer les espaces au début et à la fin de la chaine de caractères.
    et j'ai recalculé le -3 qui correspond au nombre de caractères " Mb" à supprimer à droite... (idem pour le +2 qui correspond au "<<")
    J'sais pas si c'est très clair mais j'me suis compris...
    0
  13. winzip Messages postés 10 Statut Membre
     
    Ouiiiiiin , j'ai toujours le message d'erreur : Type mismatch: 'CSng'
    Je ne vois pas le problème. Tu peux copier ce code et l'essayer chez toi STP ? ( faut d'abord créer le folder et quelques fichiers )
    Voici le fichier global :

    Dim strData, objFiles, objFSO, objFile, dbleCompteur
    Dim file, fichier, strFile

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFiles = objFSO.GetFolder("d:\backup\").Files

    dbleCompteur = 0
    For Each file In objFiles
    strFile = objFSO.OpenTextFile(file).ReadAll

    IntStart = InStrRev(strFile, "<<") +2
    IntStop = InStrRev(strFile, ">>") - 3
    If IntStart <> 0 Then
    strData = Trim(Replace(Mid(strFile, IntStart, IntStop - IntStart), ".", ","))
    End If

    dbleCompteur = dbleCompteur + CSng(strData)
    Set strFile = Nothing

    Next

    MsgBox("Le total des backups est : " & dbleCompteu & " Mb")

    ' creation du fichier qui stocke les infos

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set fichier = FSO.OpenTextFile("d:\BackupSize.txt", 2, True)
    fichier.WriteLine Rtrim(dbleCompteur)
    fichier.Close

    MERCI ENCORE de ton aide et ta patience. J'espère vraiment qu'on y arrivera...
    Tu es disponible aussi en soirée ? car je continuerai aussi ce soir assez tard
    0
  14. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    Chez moi il fonctionne très bien... Comment l'exécutes tu ? Je t'avoue que je passe toujours par Excel pour faire mes programmes en vb...
    Peux tu essayer d'afficher par exemple le contenu de strData juste après le End If pour voir ce qu'il contient stp ?
    sinon, pourquoi recréer un objet FSO alors que tu as déjà objFSO de créé ? Réutilise le...
    0
  15. winzip Messages postés 10 Statut Membre
     
    Teteve tu ES UN BOSS !
    ça marche du tonnerre !!! Mais je sais pourquoi j'ai une erreur :Invalid procedure call or argument: 'Mid'
    J'ai fait ce que tu m'as dit "Peux tu essayer d'afficher par exemple le contenu de strData juste après le End If pour voir ce qu'il contient stp" ?
    J'ai remarqué que ce message d'erreur survient quand il ne trouve aucune taille entre les << >> dans un des fichiers ou que ces << >> ne sont pas présents dans le fichier. Et donc le programme s'arrete...
    Je compte sur toi pour trouver la parade à ce problème
    Encore une fois merci Beauuuuuuuucoup pour ta patience et le temps que tu me consacres !!! :o)
    0
  16. winzip Messages postés 10 Statut Membre
     
    Teteve , tu es là ?? A l'aide.... S.O.S
    0
  17. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    j'viens de me lever, laisse moi 2 min pour prendre des news... :P
    Effectivement, je n'ai pas du tout géré la gestion des erreurs... J'ai eu la flemme à vrai dire de la faire, en espérant que tous tes fichiers soient bien conformes à l'exemple que tu m'as donné...
    0
  18. winzip Messages postés 10 Statut Membre
     
    Ah super tu es là :o)
    Dacc prends toi un bon café et welcome to the real world ;o)
    J'attends de tes news...
    0
  19. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    J'ai pas mal de choses à faire aujourd'hui, donc je ne te garantis pas de pouvoir surveiller ce sujet pour y répondre dans l'heure...

    Remplace ton "For Each" par celui-ci :

    For Each file In objFiles
    strFile = objFSO.OpenTextFile(file).ReadAll
    IntStart = InStrRev(strFile, "<<") + 2
    IntStop = InStrRev(strFile, ">>") - 3
    If (IntStart > 0) And (IntStop > 0) Then
    strData = Trim(Replace(Mid(strFile, IntStart, IntStop - IntStart), ".", ","))
    If strData <> "" Then
    dbleCompteur = dbleCompteur + CSng(strData)
    End If
    End If
    Set strFile = Nothing
    Next

    Pour être franc, ce n'est pas la meilleure gestion des erreurs qui soit... Je palie juste au fait qu'il y ait une taille vide ou qu'il ne trouve pas les "<<" ">>"...
    0
  20. winzip Messages postés 10 Statut Membre
     
    Hé ben tu es une bête, ça marche impec !
    Tu me sauves tu ne sais pas comment !
    MERCI MERCI MERCI
    ( euh.. je pourrais encore t'embêter si j'ai d'autres questions professeur teteve ?? )
    Je mets ce topic en résolu et j'en ouvrirai un autre au besoin
    Sincérement MERCI MILLE FOIS de ton aide et de tu temps que tu as consacré...
    0
  21. teteve Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   40
     
    Hi hi... *rougit*
    Euh, j'suis trèèèès loin d'être une bête en VB comme tu dis... J'en ai juste fais un peu, et n'importe quel bon programmeur pourrait optimiser 300 fois mon code... (regarde ma signature : "amateur"...)
    Merci de mettre le topic en résolu :)
    Et si je ne réponds pas à d'autres questions, d'autres prendront le relai pour t'aider j'en suis sûr... :)
    Il n'y a qu'une seule chose qui me gène... Appelle moi "Teteve tout court" :P
    Amicalement,

    Teteve

    PS : regarde tes MP aussi...
    0
  • 1
  • 2