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

Vos Contributions VBScript Discussion :

Lire/écrire une valeur de clé dans un fichier INI


Sujet :

Vos Contributions VBScript

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

    Informations forums :
    Inscription : février 2006
    Messages : 1 229
    Points : 3 327
    Points
    3 327
    Par défaut Lire/écrire une valeur de clé dans un fichier INI
    bonjour,

    compte-tenu des points communs entre le code d'écriture et de lecture
    j'ai finalement décidé d'écrire une routine regroupant les deux fonctionnalités

    donc le fichier test.ini à placer dans le répertoire "Mes Documents"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [UserHome]
    Name=
    Handy=21/10/2016 ;ceci est la clé recherchée
    WWW=
    [UserBusiness]
    Name=
    Handy=02/02/2015 ;pas celle-ci
    WWW=
    le code :
    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
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
    Set oFile = fso.GetFile(wshell.SpecialFolders("MyDocuments") & "\test.ini")
    rep = WriteReadIni(oFile,"UserHome","WWW","nouvelle valeur de clé")
    Msgbox WriteReadIni(oFile,"UserHome","WWW",Null)
     
    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
    	regSub.IgnoreCase = True
    ' lecture du fichier ini et fermeture
    	Set oText = oFile.OpenAsTextStream(1,0)
    	iniText = oText.ReadAll
    	oText.Close
    	reg.Pattern = "\[" & section & "\]([^\[]+)":regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]*)"
    	On Error Resume Next
    	If IsNull(value) Then   ' lecture clé
    		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)
    		If Err.Number = 5 Then ' section inconnue
    			iniText = iniText & vbCrLf & "[" & section & "]" & vbCrLf & key & "=" & value
    		Else
    			newSectText = regSub.Replace(sectText,key & "=" & value)
    			If newSectText = sectText Then
    				If Right(sectText,2) = vbCrLf Then keyText = key & "=" & value & vbCrLf Else keyText = vbCrLf & key & "=" & value & vbCrLf
    				newSectText = sectText & keyText
    			End If
    			iniText = reg.Replace(iniText,"[" & section & "]" & newSectText)
    		End If
    		' écriture du fichier ini mis à jour
    		Set oText = oFile.OpenAsTextStream(2,0)
    		oText.Write iniText
    		oText.Close
    		WriteReadIni = True
    	End If
    End Function
    Toute remarque sera la bienvenue avant de placer ce code dans la
    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

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

    Informations forums :
    Inscription : février 2006
    Messages : 1 229
    Points : 3 327
    Points
    3 327
    Par défaut
    nouvelle version que j'espère définitive...
    nouveautés :
    - supporte les caractères [ et ] dans les valeurs de clés
    - élimine un gros bug (il était possible de créer des doublons de couple clé/valeur)
    - renvoie faux si la tentative d'écriture concerne un couple clé/valeur qui existe déjà

    merci de me signaler les bugs éventuels avant passage dans la

    le fichier test.ini à mettre dans le même répertoire que l'exemple
    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
    [H1]
    key1=val1
    key2=val2
    key3=[aga]
    [H2]
    key5=12  ;comment
    key6=HJUY
    key2=val2
    key2=val2
    [H3]
    key7=val5
    keyx=[KKK]
    key8=val6
    keyxy=]ghghg[s
    [H4]
    key9=klm
    key10=]ghghg[s
    [H5]
    ab=op
    KKName=ss
    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
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wshell = CreateObject("WScript.Shell")
    Set oFile = fso.GetFile("test.ini")
    Msgbox WriteReadIni(oFile,"H3","keyxy",Null)
    Msgbox WriteReadIni(oFile,"H5","ab",Null)
    Msgbox WriteReadIni(oFile,"H4","testtag","[zz[")
     
    Function WriteReadIni(oFile,section,key,value)
    ' *******************************************************************************************
    ' omen999 - mars 2018 v 1.1 - http://omen999.developpez.com/
    ' é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 faux si le couple clé/valeur existait déjà sinon 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.MultiLine=True 'simplifie le pattern
      reg.IgnoreCase = True
      regSub.IgnoreCase = True
      Set oText = oFile.OpenAsTextStream(1,0)
      iniText = oText.ReadAll
      oText.Close
      reg.Pattern = "^\[" & section & "\]((.|\n[^\[])+)":regSub.Pattern = "\b" & key & " *= *([^;\f\n\r\t\v]*)"
      On Error Resume Next
      If IsNull(value) Then   ' lecture clé
        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)
        If Err.Number = 5 Then ' section inconnue
          iniText = iniText & vbCrLf & "[" & section & "]" & vbCrLf & key & "=" & value
        Else
          newSectText = regSub.Replace(sectText,key & "=" & value)
          If newSectText = sectText Then ' pas de remplacement constaté. soit le clé/valeur existe déjà soit c'est une nouvelle clé
            If regSub.Test(sectText) Then ' le couple clé/valeur existe déjà -> sortie
              WriteReadIni = False
              Exit Function	
            End If
            If Right(sectText,1) = vbCr Then keyText = key & "=" & value Else keyText = vbCrLf & key & "=" & value
            newSectText = sectText & keyText			
          End If
          iniText = reg.Replace(iniText,"[" & section & "]" & newSectText)
        End If
        Set oText = oFile.OpenAsTextStream(2,0)
        oText.Write iniText
        oText.Close
        WriteReadIni = True
      End If
    End Function
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    janvier 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2014
    Messages : 36
    Points : 54
    Points
    54
    Par défaut
    Salut merci pour ce code je l'ai mis dans mon code
    malheureusement j'ai remarqué quelques bugs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [CONFIG]
    MAJ=1.0.7
    OK=1
    MUSIC=C:\Users\MOI\Desktop
    [Logiciel]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteReadIni (oFile,"CONFIG","WEBHOOKS","KEY2")
    Qui de temps en temps me l'écrit après la balise Logiciel ou qui ne retourne pas a la ligne ou qui colle la balise [Logiciel] a la fin

    Mais je te contacte surtout pour savoir comment modifier une key ou valeur si elle existe déja ? (voir supprimé key ou valeur si possible)


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

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

    effectivement la v2 a introduit une régression...
    la v1 ne présente pas ce bug et insère ta clé correctement
    si tu n'essaies pas d'écrire un couple clé/valeur qui existe déjà
    et que tu n'a pas besoin de gérer des valeurs contenant des crochets
    la v1 fera l'affaire....
    j'ai également oublié de préciser que le code n'est pas compatible avec les
    fichiers .INI présentant un BOM. j'en ai une version compatible BOM mais elle
    n'est pas assez générique pour être publiée ici.


    pour modifier la valeur d'une clé existante, il suffit de l'écrire avec une valeur différente
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteReadIni oFile,"CONFIG","WEBHOOKS","KEY3"
    en revanche modifier une clé revient en réalité à la supprimer et à en écrire une nouvelle
    mon code ne prévoyait pas la suppression de clé
    je vais voir si je peux facilement la rajouter tout en supprimant le bug
    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

Discussions similaires

  1. [XL-2010] Chercher une valeur de cellule dans plusieurs fichiers
    Par affre dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/04/2016, 17h17
  2. Lire et écrire une valeur binaire dans la base de registre
    Par DelphiCool dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 13/02/2013, 21h46
  3. Réponses: 8
    Dernier message: 15/07/2008, 18h41
  4. (VBA) écrire une valeur dans une table
    Par migaleb dans le forum Access
    Réponses: 1
    Dernier message: 22/06/2006, 13h45
  5. Comment écrire une très longue variable dans un fichier ?
    Par hijodelanoche dans le forum Langage
    Réponses: 8
    Dernier message: 17/11/2005, 17h12

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