VBS- Traiter fichiers dans un répertoire

Résolu/Fermé
winzip - 10 oct. 2007 à 03:42
 Bernie_liege - 13 janv. 2008 à 16:49
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

22 réponses

teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 11:19
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 11:43
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 13:54
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 14:23
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 15:02
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 15:23
J'regarde ça, j'viens enfin de retrouver la fonction qui me manquait... :)
(j'ai laissé toutes mes docs au boulot...)
0
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 16:02
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 16:30
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 16: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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 16:55
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 17:17
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 17:38
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
10 oct. 2007 à 17:50
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 23:18
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 10:49
Teteve , tu es là ?? A l'aide.... S.O.S
0
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
11 oct. 2007 à 13:48
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 14:08
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
11 oct. 2007 à 14:11
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
winzip Messages postés 10 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 14:26
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
teteve Messages postés 123 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 23 février 2011 40
11 oct. 2007 à 14:31
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