VBS- Traiter fichiers dans un répertoire

Résolu
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. 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
    1. 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
      1. 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
        1. 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
          1. 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
            1. J'regarde ça, j'viens enfin de retrouver la fonction qui me manquait... :)
              (j'ai laissé toutes mes docs au boulot...)
              0
              1. 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
                1. 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
                  1. 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
                    1. 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
                      1. 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
                        1. 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
                          1. 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
                            1. 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
                              1. Teteve , tu es là ?? A l'aide.... S.O.S
                                0
                                1. 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
                                  1. 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
                                    1. 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
                                      1. 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
                                        1. 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

                                          Discussions similaires

                                          question pix mot caché

                                          7 réponses