Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : septembre 2019
    Messages : 5
    Points : 9
    Points
    9
    Par défaut VBS - Lire une section dans plusieurs fichiers ini
    Bonjour, je me casse les dents sur un besoin qui parait pourtant simple ....
    En VBS, je cherche à parcourir toute une arborescence depuis un répertoire défini (recherche récursive) pour trouver les fichiers qui se nomment "parametrage.ini".
    Une fois ces fichiers trouvés, je les édite et cherche dans la section "InformationFramework" une clé bien précise qui se nomme "Version". C'est la valeur de cette clé que je cherche à afficher/récupérer, et ce sur tous les fichiers .ini précédemment trouvés.
    J'arrive à faire la recherche récursive dans un vbs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    On error resume next
     
    Dim strFilePath, strKey, strLeftString, strLine, strSection
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
    Const ForReading   = 1
    Const ForWriting   = 2
    Const ForAppending = 8
    strFolderBase = "C:\Temp\Test" 'Dossier de base pour la récursivité, exemple C:
    StrMonFichier = "parametre.ini" 'on renseigne le nom du fichier qu'on recherche
    If NOT fso.FolderExists(strFolderBase) Then WScript.Quit 1 'Juste pour vérification que le répertoire existe
     
    Set objFolderBase = fso.GetFolder(strFolderBase)
    RechercheIni (objFolderBase)
     
     
    Sub RechercheIni (objFolder) ' La fonction prend en paramètre un objet Dossier
    	For Each objSubFolder In objFolder.SubFolders
    		RechercheIni(objSubFolder) ' Pour chaque sous-dossier, on rappelle la fonction récursive
    	Next
    	For Each objFile In objFolder.Files
    		If objfile.Name = StrMonFichier then
    			Wscript.Echo objfile.name & " + " & objfile.path		
    		 End If
    	Next 
    End Sub
    et j'arrive à lire et récupérer la valeur liée à la clé "Version"dans UN fichier ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
     
    Set tfg = fso.OpenTextFile("C:\Temp\Test\Rep2" & "\parametre.ini",1)
    Msgbox ReadIni(tfg,"InformationFramework","Version")
     
    Function ReadIni(iniFile,section,key)
    ' renvoie la valeur de la clé <key> de la section <section> de l'objet fichier <iniFile> ouvert en lecture
    Dim iniText
    ' Initialisation des objets regexp
    ' peut être déplacé dans le code principal en cas d'appels successifs
    	Set reg = New RegExp
    	Set regSub = New RegExp
    	reg.IgnoreCase = True
    	regSub.IgnoreCase = True
    ' lecture du fichier ini et fermeture
    	iniText = iniFile.ReadAll
    	iniFile.Close
    ' lecture de la clé spécifique de la section
    	reg.Pattern = "\[" & section & "\]([^\[]+)":regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]+)"
                On Error Resume Next
    	ReadIni = regSub.Execute(reg.Execute(iniText).Item(0).SubMatches(0)).Item(0).SubMatches(0)
                If Err.Number = 5 then ReadIni = False
    End Function

    Mais je n'arrive pas à combiner ces 2 scripts .....
    Si vous avez une idée .....
    Merci

  2. #2
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2009
    Messages
    3 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2009
    Messages : 3 624
    Points : 8 699
    Points
    8 699
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Option Explicit
    Const ForReading   = 1
    Const ForWriting   = 2
    Const ForAppending = 8
    Dim strFilePath, strKey, strLeftString, strLine, strSection
    Dim fso,strFolderBase,objFolderBase,objFile,IniFile,objSubFolder
    Set fso = CreateObject("Scripting.FileSystemObject")
    strFolderBase = "C:\Temp\Test" 'Dossier de base pour la récursivité, exemple C:
    If NOT fso.FolderExists(strFolderBase) Then WScript.Quit 1 'Juste pour vérification que le répertoire existe
    '---------------------Main Program------------------------------------------------------------------
    Set objFolderBase = fso.GetFolder(strFolderBase)
    Call RechercheIni(objFolderBase)
    '---------------------------------------------------------------------------------------------------
    Sub RechercheIni(objFolder) ' La fonction prend en paramètre un objet Dossier
        For Each objFile In objFolder.Files
            If LCase(fso.GetExtensionName(objFile.Name)) = "ini" then
                Wscript.Echo objfile.name & " + " & objfile.path
                Set IniFile = fso.OpenTextFile(objfile.path,ForReading)
                Wscript.Echo ReadIni(IniFile,"InformationFramework","Version")
             End If
        Next 
     
        For Each objSubFolder In objFolder.SubFolders
            RechercheIni(objSubFolder) ' Pour chaque sous-dossier, on rappelle la fonction récursive
        Next
    End Sub
    '---------------------------------------------------------------------------------------------------
    Function ReadIni(iniFile,section,key)
    ' renvoie la valeur de la clé <key> de la section <section> de l'objet fichier <iniFile> ouvert en lecture
    Dim iniText,reg,regSub
    ' Initialisation des objets regexp
    ' peut être déplacé dans le code principal en cas d'appels successifs
        Set reg = New RegExp
        Set regSub = New RegExp
        reg.IgnoreCase = True
        regSub.IgnoreCase = True
    ' lecture du fichier ini et fermeture
        iniText = iniFile.ReadAll
        iniFile.Close
    ' lecture de la clé spécifique de la section
        reg.Pattern = "\[" & section & "\]([^\[]+)":regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]+)"
                On Error Resume Next
        ReadIni = regSub.Execute(reg.Execute(iniText).Item(0).SubMatches(0)).Item(0).SubMatches(0)
                If Err.Number = 5 then ReadIni = False
    End Function
    '---------------------------------------------------------------------------------------------------

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : septembre 2019
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    salut
    merci pour ton aide mais quand j'exécute ton script, j'ai un message d'erreur suivant :
    Ligne 38 caract 5 l'entrée dépasse la fin du fichier

    Il m'affiche seulement le nom du premier fichier trouvé puis plante .....

    une idée ????

  4. #4
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2009
    Messages
    3 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2009
    Messages : 3 624
    Points : 8 699
    Points
    8 699
    Par défaut
    Citation Envoyé par fpeuchant Voir le message
    salut
    merci pour ton aide mais quand j'exécute ton script, j'ai un message d'erreur suivant :
    Ligne 38 caract 5 l'entrée dépasse la fin du fichier
    Il m'affiche seulement le nom du premier fichier trouvé puis plante .....
    une idée ????
    Cette erreur est causée par un fichier qui est vide, dans ce cas tester cette petite modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Option Explicit
    Const ForReading   = 1
    Const ForWriting   = 2
    Const ForAppending = 8
    Dim strFilePath, strKey, strLeftString, strLine, strSection
    Dim fso,strFolderBase,objFolderBase,objFile,IniFile,objSubFolder
    Set fso = CreateObject("Scripting.FileSystemObject")
    strFolderBase = "C:\Temp\Test" 'Dossier de base pour la récursivité, exemple C:
    If NOT fso.FolderExists(strFolderBase) Then WScript.Quit 1 'Juste pour vérification que le répertoire existe
    '---------------------Main Program------------------------------------------------------------------
    Set objFolderBase = fso.GetFolder(strFolderBase)
    Call RechercheIni(objFolderBase)
    '---------------------------------------------------------------------------------------------------
    Sub RechercheIni(objFolder) ' La fonction prend en paramètre un objet Dossier
        For Each objFile In objFolder.Files
            If LCase(fso.GetExtensionName(objFile.Name)) = "ini" then
                Wscript.Echo objfile.name & " + " & objfile.path
                Set IniFile = fso.OpenTextFile(objfile.path,ForReading)
                If objFile.Size > 0 Then ' Vérifier si le fichier n'est pas vide
                    Wscript.Echo ReadIni(IniFile,"InformationFramework","Version")
                End If
             End If
        Next 
     
        For Each objSubFolder In objFolder.SubFolders
            RechercheIni(objSubFolder) ' Pour chaque sous-dossier, on rappelle la fonction récursive
        Next
    End Sub
    '---------------------------------------------------------------------------------------------------
    Function ReadIni(iniFile,section,key)
    ' renvoie la valeur de la clé <key> de la section <section> de l'objet fichier <iniFile> ouvert en lecture
    Dim iniText,reg,regSub
    ' Initialisation des objets regexp
    ' peut être déplacé dans le code principal en cas d'appels successifs
        Set reg = New RegExp
        Set regSub = New RegExp
        reg.IgnoreCase = True
        regSub.IgnoreCase = True
    ' lecture du fichier ini et fermeture
        iniText = iniFile.ReadAll
        iniFile.Close
    ' lecture de la clé spécifique de la section
        reg.Pattern = "\[" & section & "\]([^\[]+)":regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]+)"
                On Error Resume Next
        ReadIni = regSub.Execute(reg.Execute(iniText).Item(0).SubMatches(0)).Item(0).SubMatches(0)
                If Err.Number = 5 then ReadIni = False
    End Function
    '---------------------------------------------------------------------------------------------------

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : septembre 2019
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    étrange du coup ....
    plus de message d'erreur mais pour le coup il m'affiche tous les .ini alors que je ne veux que ceux qui s'appellent parametre.ini
    si tu sais pourquoi ...... pas très doué moi
    ça avance, merci !!!!

  6. #6
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2009
    Messages
    3 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2009
    Messages : 3 624
    Points : 8 699
    Points
    8 699
    Par défaut
    Citation Envoyé par fpeuchant Voir le message
    étrange du coup ....
    plus de message d'erreur mais pour le coup il m'affiche tous les .ini alors que je ne veux que ceux qui s'appellent parametre.ini
    si tu sais pourquoi ...... pas très doué moi
    ça avance, merci !!!!
    Oui, car moi j'ai fait un filtre pour tous les fichiers *.ini et je n'ai pas tenu compte du nom parametre.ini seulement
    Donc, je vous laisse réflechir un peu et faire un petit effort

    EDIT :

    If LCase(fso.GetExtensionName(objFile.Name)) = "ini" And Lcase(objFile.Name) = "parametre.ini" then
    Si c'est résolu alors, n'oublies pas de passer par ce bouton
    Et bien sûr si vous êtes gentil le bounton

  7. #7
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2009
    Messages
    3 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2009
    Messages : 3 624
    Points : 8 699
    Points
    8 699
    Par défaut Code complet

    Bon,j'ai remplacé, la procèdure Sub RechercheIni(objFolder) par une fonction Function RechercheIni(objFolder,Section,Cle) qui retoune les infos à chercher et avec possibilité d'enregistrer les résultats dans un fichier texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Option Explicit
    '----------------------------------------Programme Principal----------------------------------------
    Const ForReading   = 1
    Const ForWriting   = 2
    Const ForAppending = 8
    Dim strFilePath, strKey, strLeftString, strLine, strSection,Info,Resultat
    Dim fso,strFolderBase,objFolderBase,objFile,IniFile,objSubFolder,ReportFile,Ws
    Info = ""
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Ws = CreateObject("WScript.Shell")
    strFolderBase = "C:\Temp\Test" 'Dossier de base pour la récursivité, exemple C:
    ReportFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "txt"
    If NOT fso.FolderExists(strFolderBase) Then WScript.Quit 1 'Juste pour vérification que le répertoire existe
    Set objFolderBase = fso.GetFolder(strFolderBase)
    Resultat = RechercheIni(objFolderBase,"InformationFramework","Version")
    wscript.echo Resultat
    Call WriteReport(Resultat,ReportFile)
    If fso.FileExists(ReportFile) Then Ws.Run ReportFile
    '---------------------------------------------------------------------------------------------------
    Function RechercheIni(objFolder,Section,Cle) ' La fonction prend en paramètre un objet Dossier
        For Each objFile In objFolder.Files
            If LCase(fso.GetExtensionName(objFile.Name)) = "ini" And Lcase(objFile.Name) = "parametre.ini" then
                Set IniFile = fso.OpenTextFile(objfile.path,ForReading)
                If objFile.Size > 0 Then ' Vérifier si le fichier n'est pas vide
                    Info = Info & Vbcrlf & objfile.name & " ==> " & objfile.path
                    Info = Info & Vbcrlf & ReadIni(IniFile,Section,Cle) & Vbcrlf & String(80,"-")
                End If
             End If
        Next 
     
        For Each objSubFolder In objFolder.SubFolders
            Call RechercheIni(objSubFolder,Section,Cle) ' Pour chaque sous-dossier, on rappelle la fonction récursive
        Next
        RechercheIni = Info
    End Function
    '---------------------------------------------------------------------------------------------------
    Function ReadIni(iniFile,section,key)
    ' renvoie la valeur de la clé <key> de la section <section> de l'objet fichier <iniFile> ouvert en lecture
    Dim iniText,reg,regSub
    ' Initialisation des objets regexp
    ' peut être déplacé dans le code principal en cas d'appels successifs
        Set reg = New RegExp
        Set regSub = New RegExp
        reg.IgnoreCase = True
        regSub.IgnoreCase = True
    ' lecture du fichier ini et fermeture
        iniText = iniFile.ReadAll
        iniFile.Close
    ' lecture de la clé spécifique de la section
        reg.Pattern = "\[" & section & "\]([^\[]+)":regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]+)"
                On Error Resume Next
        ReadIni = regSub.Execute(reg.Execute(iniText).Item(0).SubMatches(0)).Item(0).SubMatches(0)
                If Err.Number = 5 then ReadIni = False
    End Function
    '---------------------------------------------------------------------------------------------------
    Sub WriteReport(strText,ReportFile)
        Dim fs,ts 
        Const ForWriting = 2
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set ts = fs.OpenTextFile(ReportFile,ForWriting,True)
        ts.WriteLine strText
        ts.Close
    End Sub
    '---------------------------------------------------------------------------------------------------

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    septembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : septembre 2019
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    merci pour ton aide
    j'avais modifié ton code pour ne cibler que mon fichier ini
    celui-ci est pas mal aussi avec cette sortie texte
    merci pour ton aide, pb résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tester la présence d'une section dans un fichier .ini
    Par clairetj dans le forum Zend Framework
    Réponses: 1
    Dernier message: 14/12/2015, 15h34
  2. Lire le nom d'une section d'un fichier INI
    Par Flow_75 dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/02/2007, 22h01
  3. Réponses: 5
    Dernier message: 22/08/2006, 10h35
  4. Comment écrire une section dans un fichier ini?
    Par Jayceblaster dans le forum Delphi
    Réponses: 5
    Dernier message: 26/06/2006, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo