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

VBScript Discussion :

modifier chaine de cractères dans fichier ini


Sujet :

VBScript

  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 modifier chaine de cractères dans fichier ini
    Bonjour,
    j'ai un script sur lequel je sèche ....
    Mon besoin : je cherche dans une arborescence un fichier .ini qui se nomme parametre.ini
    voici un exemple de son contenu (dans ce fichier la valeur de Version n'est pas bonne et je veux la modifier) :
    Code ini : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [aaaa]
    test=0
    [InformationFramework]
    Version=xxxxx
    [bbbb]
    valeur=00
    V2 - 1.17
    Dans ce fichier je cherche la section [InformationFramework] et la sous-donnée "Version"
    Si la valeur pour cette donnée est égale à "V2 - 1.17" alors je ne fais rien. Sinon, je remplace la valeur en place par "V2 - 1.17"

    J'arrive à trouver le fichier et mes éléments dans le fichier .ini par contre je n'arrive pas à écrire et remplacer la chaine de caractères

    voici mon script, merci pour votre aide !!!

    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
    Dim strFilePath, strKey, strLeftString, strLine, strSection
    Dim vif, chemin
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
     
    strFolderBase = "C:\Temp\test" 'Dossier de base pour la récursivité
    ' StrMonFichier = "parametre.ini" 'nom du fichier recherché
     
    If NOT fso.FolderExists(strFolderBase) Then WScript.Quit 1 'Vérification que le répertoire existe
    Set objFolderBase = fso.GetFolder(strFolderBase)
    WScript.Echo "objFolderBase : " & objFolderBase
    ' Executer la fonction de rechercche récursive
    RechercheIni (objFolderBase)
     
    ' FONCTIONS
     
    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
    	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 RechercheIni (objFolder) ' La fonction prend en paramètre un objet Dossier
    	For Each objSubFolder In objFolder.SubFolders
    		'WScript.Echo "objSubFolder.Path : " & objFolder
    		RechercheIni(objSubFolder) ' Pour chaque sous-dossier, on rappelle la fonction récursive
    	Next
     
    	For Each objFile In objFolder.Files                             
    		If objfile.Name = "parametre.ini" then                
    			set File = fso.OpenTextFile(objfile.path,1)
    			vif = ReadIni (File,"InformationFramework","Version")
    			'WScript.Echo vif
    			'chemin = objfolder
    			If vif = "V2 - 1.16" Then
    				WScript.Echo "version présente"
    				Else
    				WScript.Echo "version non présente"
    				objfile.WriteLine("vif")
    			End If                                                                                                                                 
    		End If
    	Next
    End Sub

  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

    J'ai fait juste un test sur un seul fichier parametre.ini qui se trouve dans ce chemin c:\temp\Test\parametre.ini avec ces valeurs :
    Code INI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [aaaa]
    test=0
    [InformationFramework]
    Version=V2 - 1.12
    [aabb]
    test=2
    et le code vbscript :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
    Set oFile = fso.GetFile("c:\temp\Test\parametre.ini")
    NewData = "V2 - 1.17"
    'ici pour lire la valeur de la cle Version sous la Section InformationFramework
    vif = WriteReadIni(oFile,"InformationFramework","Version",Null)
    wscript.echo "Version = "& vif
     
    If vif = "V2 - 1.16" Then
        WScript.Echo "version présente"
    Else
        WScript.Echo "version non présente"
        WScript.Echo "La valeur a ete remplace : "& WriteReadIni(oFile,"InformationFramework","Version",NewData)
        vif = WriteReadIni(oFile,"InformationFramework","Version",Null)
        wscript.echo "La valeur de la cle Version a ete mis a jour = "& vif
    End If 
     
    '-------------------------------------------------------------------------------------------------------------------------------------------
    Function WriteReadIni(oFile,section,key,value)
    ' écrit/lit la clé <key> de section <section> de l'objet fichier oFile avec la valeur <value> si lecture : value = Null 
    ' en écriture si la section et/ou la clé n'existent pas, elles seront créées
    ' en écriture renvoie toujours vrai, en lecture renvoie soit : la valeur de clé, une chaine vide en cas de clé vide ou Faux si la clé n'existe pas
    Dim oText,iniText,sectText,newSectText,keyText
    ' 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
      reg.MultiLine=True
      regSub.IgnoreCase = True
      ' lecture du fichier ini et fermeture
      Set oText = oFile.OpenAsTextStream(1,0)
      iniText = oText.ReadAll
      oText.Close
      '*************************************************** 
      reg.Global=True
      reg.Pattern = "^\[(.+)\]"
      Set Matches=reg.Execute(iniText)
      iC=Matches.Count
      For Each Match In Matches
        iC=iC-1
        If Match.SubMatches(0)=section Then Exit For
      Next
      reg.Global=false
      reg.Pattern = "^\[" & section & "\]((.|\n)+)((\n\[(.|\n)+){"&iC&"})" ' quid pattern statique?
      '***************************************************
      regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]*)" 'pas de clé multiline
      On Error Resume Next
      If IsNull(value) Then   ' lecture clé
        Set Matches=reg.Execute(iniText)    
        WriteReadIni = regSub.Execute(reg.Execute(iniText).Item(0).SubMatches(0)).Item(0).SubMatches(0)
        If Err.Number = 5 then WriteReadIni = False
      Else                                ' écriture clé
        sectText = reg.Execute(iniText).Item(0).SubMatches(0)
        nextText = reg.Execute(iniText).Item(0).SubMatches(2) ' le reste du fichier après la section trouvée ->conseq submatch
        If Err.Number = 5 Then ' section inconnue elle est ajoutée en fin de fichier
          iniText = iniText & vbCrLf & "[" & section & "]" & vbCrLf & key & "=" & value
        Else ' la section existe on tente de remplacer la clé
          newSectText = regSub.Replace(sectText,key & "=" & value)
         If newSectText = sectText Then ' pas de remplacement opéré, la clé n'existe pas donc on l'ajoute en fin de section
           If Right(sectText,1) = vbCr Then keyText = key & "=" & value Else keyText = vbCrLf & key & "=" & value
           newSectText = sectText & keyText
         End If
         ' remplacement de la section ancienne par la section maj
         iniText = reg.Replace(iniText,"[" & section & "]" & newSectText & nextText)
        End If
        ' msgbox iniText
        ' écriture du fichier ini mis à jour
        Set oText = oFile.OpenAsTextStream(2,0)
        oText.Write iniText
        oText.Close
        WriteReadIni = True
      End If
    End Function
    '-------------------------------------------------------------------------------------------------------------------------------------------

  3. #3
    Membre expert

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 716
    Points : 3 228
    Points
    3 228

  4. #4
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 223
    Points : 3 315
    Points
    3 315
    Par défaut
    bonjour,

    J'arrive à trouver le fichier et mes éléments dans le fichier .ini par contre je n'arrive pas à écrire et remplacer la chaine de caractères
    en même temps, si tu te contentes d'appeler la fonction ReadIni au lieu de WriteReadIni, ce n'est pas très surprenant...


    Si la valeur pour cette donnée est égale à "V2 - 1.17" alors je ne fais rien. Sinon, je remplace la valeur en place par "V2 - 1.17"
    dans ce genre de situation, le test est généralement inutile : il suffit de forcer systématiquement l'écriture de la valeur "V2 - 1.17"
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

Discussions similaires

  1. [Batch] Modifier quelques valeurs dans fichier ini
    Par Minus63 dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 09/07/2018, 13h58
  2. Résultat d'une requête dans fichier ini
    Par bruno28 dans le forum VBA Access
    Réponses: 6
    Dernier message: 13/06/2007, 16h29
  3. Parametre dans fichier ini pour base fractionnée
    Par sunvialley dans le forum Access
    Réponses: 5
    Dernier message: 28/07/2006, 14h38
  4. [C#] Comment lire/ecrire dans fichier ini ?
    Par meli0207 dans le forum C#
    Réponses: 2
    Dernier message: 20/03/2006, 16h53
  5. chaines de caractères dans fichier .rc ou .res
    Par raggadoll dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/03/2004, 15h19

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