Problème pour Importer des infos à partir de plusieurs fichier TXT dans une feui

odimenokyo Messages postés 3 Date d'inscription jeudi 2 février 2006 Statut Membre Dernière intervention 26 janvier 2007 - 26 janv. 2007 à 00:09
odimenokyo Messages postés 3 Date d'inscription jeudi 2 février 2006 Statut Membre Dernière intervention 26 janvier 2007 - 26 janv. 2007 à 17:19
Bonsoir,

Je tiens à signaler que je suis complètement novice et que j'apprends le VBscript.

J'ai récupéré un script qui permet de récupérer sur de multiple serveurs (liste de serveurs) des infos précises à partir d'un fichier txt en l'occurence le fichier le plus récent et de les exporter vers un fichier Excel. Le script en lui même fonctionne mais il y a un problème.
Exemple :
Server1
>> dans le répertoire 'c:\rep' il y a plusieurs fichiers marqué : 'BEX012.txt', 'BEX013.txt', 'BEX014.txt', 'BEX015.txt'.... Il peut y avoir un ou deux fichiers crées chaque jour....
Server2
>> dans le répertoire 'c:\rep' il y a plusieurs fichiers marqué : 'BEX015.txt', 'BEX023.txt', 'BEX024.txt', 'BEX025.txt'.... Il peut y avoir un ou deux fichiers crées chaque jour....
 et ainsi de suite sur plusieurs serveurs...

Le but est de récupérer à chaque fois sur chaque serveur les infos du dernier fichier txt créé sans forcément tenir compte du nom de fichier.

Mon problème :
Quand je lance le script, il va vérifier le premier serveur, récupère bien les infos désirées du dernier fichier créé (par exemple 'BEX015.txt') et les incères dans la feuille Excel. Tout se passe bien !!
Là le problème commence, quand il passe sur le second serveur, le script ne vas plus vérifier le dernier fichiers créé mais se base sur le nom du fichier du premier serveur vérifié (BEX015.txt) alor que le dernier fichier créé se nomme 'BEX025.txt' (ou un autre nom). Et ainsi de suite pour tous les autres serveurs.

Voici le code :

****************************************************
Dim ExcelSheet
Dim Age
Dim TextStream
Dim fileObj
Dim Fso
Dim strLatestFile
Dim DateInfo
Dim DiffADate
Dim msg
Dim strPath
Dim strSaveFolder
Dim NewAge


on error resume next


'
' the backup exec folder containing the logs must be shared as 'bx$'
' LIST OF SERVER TO BE CHECKED, list then as <server> not [file://\\<server \\<server]>
' one per line...


strPath = "c:\scripts\servers.txt"


'require folder 'strSaveFolder' to store excel sheets


strSaveFolder = "c:\backuplogs"


Set ExcelSheet = CreateObject("Excel.Sheet")
ExcelSheet.Application.Visible = True
ExcelSheet.ActiveSheet.Cells(1, 1).Value = "This is column A, row 1"
ExcelSheet.ActiveSheet.Columns(1).ColumnWidth = 15
ExcelSheet.ActiveSheet.Columns(2).ColumnWidth = 40
ExcelSheet.ActiveSheet.Columns(3).ColumnWidth = 30
ExcelSheet.ActiveSheet.Columns(4).ColumnWidth = 35
ExcelSheet.ActiveSheet.Cells(1, 1).Value = "Server"
ExcelSheet.ActiveSheet.Cells(1, 2).Value = "Date completed"
ExcelSheet.ActiveSheet.Cells(1, 3).Value = "Status"
ExcelSheet.ActiveSheet.Cells(1, 4).Value = "Error"
ExcelSheet.ActiveSheet.Cells(1, 4).Value = Date
Row = 2
col = 1


Set Fso = CreateObject("scripting.FileSystemObject")
If (Fso.FileExists(strPath)) Then
 Set ServerList = Fso.OpenTextFile(strPath, 1)
Else
 MSGBOX "we need a list of servers guys!"
End If


Do Until ServerList.AtEndOfLine = True
    strServer = ServerList.ReadLine
    strPath = "\" & strServer & "\bx$"
    If (Fso.FolderExists(strPath)) Then
        Set folderObj = Fso.GetFolder(strPath)
    Else
        ExcelSheet.ActiveSheet.Cells(Row, 2).Value = strServer
        ExcelSheet.ActiveSheet.Cells(Row, 3).Value = "No BX$ share on server"
End If


Set fileContainer = folderObj.Files


For Each fileObj In fileContainer


 strRt = Right(fileObj.Name, 3)
        If strRt = "txt" Then
   strFile = fileObj.Name


   DiffADate = DateDiff("d",fileObj.DateCreated,Now)
   NewAge = DiffADate
   If (NewAge < Age=true) or (Age="") Then
    strLatestFile = fileObj.Name
    Age = NewAge
   End If
        End If
Next


strPath = strPath & "" & strLatestFile
set fileObj = Fso.GetFile(strPath)
Set TextStream = fileObj.OpenAsTextStream(1)
ExcelSheet.ActiveSheet.Cells(Row, 1).Value = strServer
col = col + 1
ExcelSheet.ActiveSheet.Cells(Row, 3).Value = "failed..."


Do While Not textstream.AtEndOfStream
 Str = textstream.ReadLine
        posErr = InStr(Str, "^ ")
        posEnd = InStr(Str, "b ended:")
        posCom = InStr(Str, "completed on")
        posStatus = InStr(Str, "completion status:")
If posCom <> 0 Then
 Str = Mid(Str, 8, 35)
        ExcelSheet.ActiveSheet.Cells(Row, 2).Value = Str
        ExcelSheet.ActiveSheet.Cells(Row, 3).Value = "pending tape change"
End If
If posEnd = 3 Then
 Str = Mid(Str, 12, 50)
        ExcelSheet.ActiveSheet.Cells(Row, 2).Value = Str
End If
If posStatus = 5 Then
 Str = Mid(Str, 24, 35)
        ExcelSheet.ActiveSheet.Cells(Row, 3).Value = Str
End If
If posErr <> 0 Then
 ExcelSheet.ActiveSheet.Cells(Row, 4).Value = LastStr
        col = col + 1
End If
LastStr = Str
Loop


Str = ""
LastStr = ""
Row = Row + 1
Loop


If (Fso.FolderExists(strSaveFolder)) Then
 strSaveAs = Date
 strSaveAs = Replace(strSaveAs, "/", "-")
 strSaveAs = "c:\backuplogs" + strSaveAs + ".xls"
        ExcelSheet.SaveAs strSaveAs
Else
 MsgBox "No C:\backuplogs folder on this server", vbInformation
End If


**************************************************************
MERCI à vous tous pour votre aide et ce que vous allez m'apprendre, moi je retourne à mes tutoriaux et continue à chercher.

Odi

3 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
26 janv. 2007 à 10:00
 Bonjour,

Sauf erreur de ma part, je ne suis pas certain que la boucle "For Each fileObj ....Next ", telle qu'elle est écrite, récupère le fichier le + récent.

Ci-dessous un exemple pour récupérer le fichier "le plus récent" d'un répertoire.
D'autre part, à quoi correspond:
strPath = "\" & strServer & "\bx$"

Option Explicit
'
Const Path_Server = "[file://\\Oxalys\OXALYS\OXAARC\LOGC\2006\ \\Oxalys\OXALYS\OXAARC\LOGC\2006\]"

Dim fso, dossier, fichiers, fileItem
Dim fichier, i,imax, z, valeur, cible, resultat
imax = 0



Set fso = CreateObject("Scripting.FileSystemObject")
Set dossier  = fso.GetFolder(Path_Server)
Set fichiers = dossier.Files



'début de l'énumération des fichiers
For Each fichier In fichiers    If Left(fichier.Name, 6) "DIA7LM" And UCase(Right(Fichier,3)) "MDB" Then
       Set fileItem = fso.GetFile(fichier)
   
       imax = imax + 1
       ReDim Preserve Tableau(2, imax)
       Tableau(1, imax) = Fichier.Name
       Tableau(2, imax) = FileItem.DateLastModified



       '--- Tri chronologique des fichiers (des + récents aux + anciens) ---
       Do
       Valeur = 0
       For i = 1 To imax - 1
           If CDate(Tableau(2, i)) < CDate(Tableau(2, i + 1)) Then
              For z = 1 To 2
                  Cible = Tableau(z, i)
                  Tableau(z, i) = Tableau(z, i + 1)
                  Tableau(z, i + 1) = Cible
              Next
           Valeur = 1
           End If
       Next
       Loop While Valeur = 1
    End If
Next



If imax=0 Then MsgBox "Repertoire vide - abandon du traitement" : WScript.Quit



MsgBox Tableau(1, 1) & vbTab& Tableau(2, 1),,"fichier le + récent du repertoire " & Path_Server



'For i = 1 To imax
'    Tableau(1, i) = DIA7LM12,mdb puis 11 etc...
'    MsgBox Tableau(1, i),,"Tableau(1, i)" & "   " & i
'    resultat = resultat &vbCrLf& Tableau(1, i) & vbTab& Tableau(2, i)
'    MsgBox resultat
'    If i = imax Then MsgBox resultat,,"liste triée"
'Next



Set fso = Nothing
Set dossier  = Nothing
Set fichiers = Nothing





jean-marc
0
odimenokyo Messages postés 3 Date d'inscription jeudi 2 février 2006 Statut Membre Dernière intervention 26 janvier 2007
26 janv. 2007 à 10:28
Bonjour Jean-Marc,

Merci d'avoir répondu si vite !! 

La boucle, je l'ai vérifié et elle récupère bien le fichier '****.txt' le plus récent, mais la boucle, elle est faite qu'une seule fois finalement puisque par la suite il reprend ce même nom de fichier '****.txt qu'il a trouvé sur le premier serveur. En tout cas tu as bien vu là où était le problème, finalement, il faudrait qu'à chaque fois sur chaque serveur il refasse la boucle..... 

strPath = "\" & strServer & "\bx$"correspond en fait à un répertoire partagé sur chaque serveur, c'est le fameux répertoire où se trouve les fichiers '*****.txt' sur chaque serveur, et moi pour vous demander de l'aide, dans ma première explication je l'avais remplacer par "dans le répertoire 'c:\rep' ". en tout cas bien vue....

Je vais voir ce que je peux faire avec ce que tu m'as apporté et comment l'inégrer.

je dirai par la suite ce que cela donne..

Merci et toujours ouvert à d'autres possibilités

Odi
0
odimenokyo Messages postés 3 Date d'inscription jeudi 2 février 2006 Statut Membre Dernière intervention 26 janvier 2007
26 janv. 2007 à 17:19
Rebonjour Jean-Marc,

en fait il manquait une init des variables à l'entrée de la boucle serveur
il fallait que je rajoute après le "Do Until ServerList.AtEndOfLine = True"
    Age=""
    NewAge=""

Voila merci pour tout.

Odi
0
Rejoignez-nous