Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lire fichier ini ligne à ligne entre section

18 réponses
Avatar
Pasobo
Bonsoir,

J'ai un petit besoin :

Lire toutes les lignes entre 2 sections dans un fichier ini.

Pour l'instant, j'ai trouvé comment lire la valeur précise d'une entrée dans
une section.
http://www.motobit.com/tips/detpg_asp-vbs-read-write-ini-files/
Mais, maintenant, j'ai besoin de lire toute les lignes d'une section
précise.

Merci d'avance si vous avez des pistes,

Pasobo

10 réponses

1 2
Avatar
Jean
Lire toutes les lignes entre 2 sections dans un fichier ini.


Sur (feu et regretté) le site de Clarence Washington, celui-ci le fait
je crois:

http://64.233.183.104/search?qÊche:Xau9tf26Ug8J:cwashington.netreach.net/depo/view.asp%3FIndex%3D553


Amicalement,

--
Jean - JMST
Belgium

Avatar
Pasobo
Merci Jean,

J'ai testé le vbs, mais il permet comme le lien que j'avais trouvé de lire
la valeur d'une entrée dans une section.

Moi, j'ai besoin de lire toute les lignes d'une section.
Mon objectif est de passer en paramètre le nom de la section et d'aller lire
ligne à ligne le contenu de cette section.

J'ai réussi à lire la première ligne d'une section.
A lire toute les lignes d'une section mais seulement si c'était la 1ère.
Et encore, je ne détecte pas que ma section est finie, ou mal.

Donc, j'ai tout mis à la poubelle, et je suis reparti à partir des fonctions
readini, comme celle que tu m'as proposé.

Mais je n'arrive pas encore à lire toute les lignes entre 2 sections.

Pasobo
Avatar
Th.A.C
Pour mon boulot, j'avais fait ça (c'est pas du tout optimisé).
Ca permet de récupérer toute une section et ça décompose les différents
paramètres d'une ligne en essayant de gérer les guillemets, les
virgules, ...
De base, c'est prévu pour lire une clé dans la base de registre et
ensuite d'aller chercher la section correspondant dans un fichier
applications.ini.
Le but était d'installer automatiquement des applications en fonction
d'un type de machine.
Je l'ai fait sous forme de classe pour essayer de la rendre le plus
indépendante possible.
Certaines lignes font plus de 80 caractères à cause de l'indentation...

--------------------------------------------------------------
OPTION EXPLICIT

' Déclaration des Variables
DIM Executable, Chemin, Parametre, Description
DIM WshShell, Fso
DIM NomFichier, TypeMaster, TrouveSection, FichierIni

' Initialisation des variables
' ----------------------------
SET WshShell = WScript.CreateObject("WScript.Shell")
SET Fso = CreateObject("Scripting.fileSystemObject")
NomFichier = "Applications.ini"
TypeMaster = WshShell.RegRead("HKLMSoftwareMasterType")
TrouveSection = FALSE
SET FichierIni = NEW Ini
Dim Chaine, Boucle, Boucle1

' charge le fichier
FichierIni.NomFichier = NomFichier
IF FichierIni.Erreur <> 0 THEN
WSCRIPT.Echo ("Fichier non trouve")
ELSE
' extrait la section
FichierIni.NomSection = TypeMaster
IF FichierIni.Erreur <> 0 THEN
WSCRIPT.Echo ("Section non trouvée")
ELSE
wscript.echo ("Section : " & FichierIni.PrNomSection & VBCRLF &_
"Nbre de clés : " & FichierIni.Cles(0,0))
FOR Boucle = 1 TO FichierIni.Cles(0,0)
FOR Boucle1 = 1 TO FichierIni.cles(Boucle,0)
wscript.echo ("Clé : " & FichierIni.NomCles(Boucle) &
VBCRLF &_
"Paramètre n°" & Boucle1 & " : " &"-" &
FichierIni.cles(Boucle,Boucle1) & "-")
NEXT
NEXT
END IF
END IF



CLASS ini
PUBLIC PrNomFichier
PUBLIC PrNomSection
PUBLIC NombredeCles
PUBLIC Cles(100,20)
PUBLIC NomCles(100)
PUBLIC Erreur, Ligne
PUBLIC FichierNonTrouve
PUBLIC CleNonTrouvee
PUBLIC ErreurSection
PUBLIC ErreurCle

PRIVATE Fso, Tableau, DebutSection, FinSection

PRIVATE SUB Class_Initialize ' Setup Initialize event.
Err = 0
FichierNonTrouve = 1
CleNonTrouvee = 2
ErreurSection = 3
ErreurCle = 4
SET fso=CreateObject("Scripting.FileSystemObject")
END SUB

PRIVATE SUB Class_Terminate ' Setup Terminate event.
SET fso=Nothing
END SUB

' charge le fichier
PUBLIC PROPERTY LET NomFichier(sNomFichier)
DIM Fichier, BlocFichier
PrNomFichier = sNomFichier
IF Fso.FileExists(PrNomFichier) THEN ' Si
le fichier existe
Erreur = 0
SET Fichier = Fso.OpenTextFile(sNomFichier,1) '
Ouvre le fichier en lecture
BlocFichier = Fichier.ReadAll ' Lit le
fichier d'un bloc
Fichier.Close ' Ferme le
fichier
SET Fichier = Nothing ' Libère
l'objet
Tableau = SPLIT(BlocFichier,VBCrLf, -1, 1) ' découpe le
fichier en ligne
ELSE
Erreur = FichierNonTrouve
END IF
END PROPERTY

PUBLIC PROPERTY LET NomSection(sSection) ' Extrait la section
quand on la défini dans la class
PrNomSection = sSection
IF TrouveSection(Tableau, sSection, DebutSection,
FinSection) THEN
Erreur = 0
ExtraitSection
ELSE
Erreur = CleNonTrouvee
NombredeCles = 0
DebutSection = 0
FinSection = 0
Erase Cles ' Vide le tableau Cles sans le supprimer
END IF
END PROPERTY

' Trouve le début et la fin de la section dans le tableau
PRIVATE FUNCTION TrouveSection(ByRef Tableau, sSection, ByRef
DebutSection, ByRef FinSection)
DebutSection = TrouveDebutSection(Tableau, sSection)
IF DebutSection <> 0 THEN
FinSection = TrouveFinSection(Tableau, DebutSection)
END IF
TrouveSection = (DebutSection <> 0)
END FUNCTION

' Trouve le début de la section dans le tableau
PRIVATE FUNCTION TrouveDebutSection(ByRef Tableau, sSection)
DIM Boucle, X, Chaine, DebutSection
sSection = UCASE(sSection)
DebutSection = 0
FOR Boucle = 0 TO UBound(Tableau)
Chaine = UCASE(TRIM(Tableau(Boucle)))
IF LEFT(Chaine,1)="[" THEN
X = INSTR(2,Chaine, "]", 1)
IF X > 2 THEN ' si on a trouve l'autre crochet
Chaine = UCASE(MID(Chaine,2,X-2)) ' Extrait le
nom de la section
IF Chaine = sSection THEN
DebutSection = Boucle + 1
EXIT FOR
END IF
END IF
END IF
NEXT
TrouveDebutSection = DebutSection
END FUNCTION

PRIVATE FUNCTION TrouveFinSection(ByRef Tableau, DebutSection)
DIM Boucle, FinSection, Chaine
FinSection = 0
FOR Boucle = DebutSection TO UBound(Tableau)
Chaine = TRIM(Tableau(Boucle))
IF LEFT(Chaine,1) = "[" THEN
FinSection = Boucle - 1
EXIT FOR
END IF
NEXT
IF FinSection = 0 THEN FinSection = UBound(Tableau)
TrouveFinSection = FinSection
END FUNCTION

PRIVATE SUB ExtraitSection
DIM Boucle, Parametres, Chaine, Position, Position2
Parametres = 0
NombreDeCles = 0
FOR Boucle = DebutSection to FinSection
Chaine = NettoieLigne(Tableau(Boucle))

'wscript.echo "Ligne analysée : " & tableau(boucle) & VBCRLF & _
' "Ligne nettoyée : " & Chaine

IF INSTR(";#",LEFT(Chaine,1)) THEN 'la ligne est un
commentaire
Chaine = ""
END IF
Position = INSTR(Chaine, "=")
' Si on trouve '=', alors on extrait le nom de la clé
IF Position <> 0 THEN
' Remet le compteur de parametre à 0
Parametres = 0
'Incrémente le nbre de clés
NombreDeCles = NombreDeCles + 1
' Mémorise le nom de la clé
NomCles(NombredeCles) = TRIM(LEFT(Chaine,Position
- 1))

'wscript.echo "Clée trouvée : '" & Cles(NombreDeCles,0) & "'"

' On se positionne 1 caractere après le ' on met dans 'chaine' tout ce qui est après le '='
Chaine = TRIM(MID(Tableau(Boucle),Position + 1))
' La chaine ne contient plus que des paramètres
Position = 1
' Tant que la chaine à traiter n'est pas vide
DO WHILE Chaine <> ""
Chaine = TRIM(Chaine)
' Si on trouve un ", on cherche le " suivant
IF LEFT(Chaine,1) = """" THEN
Position = INSTR(2, Chaine, """")
' Si pas de ", on prend jusqu'à la fin de la
chaine
IF Position = 0 THEN
Position = LEN(Chaine)
END IF
ELSE
' si pas de ", on cherche la ',' suivante
Position = INSTR(2, Chaine, ",")
' si pas de ',' on prend jusqu'à la fin de
la chaine
If Position = 0 THEN
Position = LEN(Chaine)
ELSE ' On se positionne juste avant
la virgule
Position = Position - 1
END IF
END IF
' si position > 1, c'est qu'on a trouve un
parametre
IF Position > 1 THEN
Parametres = Parametres + 1
Cles(NombredeCles, Parametres)=
LEFT(Chaine,Position)
Chaine = MID(Chaine,Position + 2)
Position = 1

'wscript.echo Cles(NombredeCles, Parametres)

END IF
LOOP
'Memorise le nombre de parametres de la clé courante
Cles(NombredeCles, 0) = Parametres
END IF
NEXT
' Mémorise le nombre de Cles de la section analysée
Cles(0,0) = NombredeCles
END SUB

PRIVATE FUNCTION NettoieLigne(sChaine)
sChaine = TRIM(sChaine) ' enlève les espaces
sChaine = REPLACE(sChaine, vbTab,"") ' enlève les tabulations
' IF INSTR(sChaine,"#") THEN sChaine =
TRIM(SPLIT(sChaine,"#",-1,1))
IF LEFT(sChaine,1) = "#" THEN sChaine = "" ' annule la
ligne si commentaire
NettoieLigne = sChaine
END FUNCTION

END CLASS


--------------------------------------------------------------
Avatar
Méta-MCI
Bonjour !


Ce petit batch permet de visualiser les lignes d'une section :

@echo off
setlocal

set ini=win.ini
set section=[Mail]

set flagúUX
FOR /F %%a IN (%ini%) DO CALL :SUB %%a
endlocal
goto :EOF

:SUB
set tmp=%*XX
set debut=%tmp:~0,1%
IF /I %debut% EQU [ CALL :BOF %*
IF /I %flag% EQU VRAI echo %*
goto :EOF

:BOF
set flagúUX
if %*==%section% set flag=VRAI
goto :EOF



Pour les 3e & 4e lignes, on pourrrait mettre :
set ini=%1
set section=%2
pour passer en paramètres le nom du fichier .INI, et la section à
rechercher.


Si le VBS est indispensable, il est toujours possible d'appeler le batch,
avec RUN


@-salutations

Michel Claveau
Avatar
Jean
J'ai testé le vbs, mais il permet comme le lien que j'avais trouvé de lire la
valeur d'une entrée dans une section.


J'avais pourtant lu dans les commentaires du script :

' If you pass READINI(file,"section", ""), function returns array of
all keys ' under "section"

Mais je n'ai pas testé :-)
Désolé donc si ça ne fonctionne pas comme prévu (à vérifier).

Amicalement,

--
Jean - JMST
Belgium

Avatar
Pasobo
Bonjour,

Quand je passe
READINI(file,"section", "")

J'ai en retour une erreur.

Sinon, si je passe READINI(file, section, key)
Le script fonctionne parfaitemement.

C'est dommage, c'était exactement la solus.
Encore merci.

Pascal


"Jean" a écrit dans le message de news:

J'ai testé le vbs, mais il permet comme le lien que j'avais trouvé de
lire la valeur d'une entrée dans une section.


J'avais pourtant lu dans les commentaires du script :

' If you pass READINI(file,"section", ""), function returns array of all
keys ' under "section"

Mais je n'ai pas testé :-)
Désolé donc si ça ne fonctionne pas comme prévu (à vérifier).

Amicalement,

--
Jean - JMST
Belgium





Avatar
pasoboiv
Bonjour,

Je viens de tester ton script,

Mais il me renvoie que la 1ère ligne de la section.

A quoi sert la fonction NettoieLigne ?

Pascal
Avatar
pasoboiv
Bonjour,

J'ai également essayé le batch,

Il ne renvoie rien.

Au mieux si je remplace dans la ligne
IF /I %flag% EQU VRAI echo %*


VRAI par FAUX
il renvoie la valeur de ini, cad le nom du fichier.

Merci de ton aide,

Pascal

Avatar
pasoboiv
Bonjour,

J'ai également essayé le batch,

Il ne renvoie rien.

Au mieux si je remplace dans la ligne
IF /I %flag% EQU VRAI echo %*


VRAI par FAUX
il renvoie la valeur de ini, cad le nom du fichier.

Merci de ton aide,

Pascal

Avatar
Gilles LAURENT
"Pasobo" a écrit dans le message de
news:4501e633$0$8495$
| Bonsoir,

Bonjour,

| J'ai un petit besoin :
| Lire toutes les lignes entre 2 sections dans un fichier ini.

Ci-dessous la fonction VBScript ReadIni permettant je l'espère de
répondre à votre besoin. Il est à noter que les lignes mises en
commentaire dans les fichiers INI sont également supportées par cette
fonction.

-- Coupez-ici : ReadIni.vbs --

Function ReadIni (strFile, strSection, strKey)

Set oFS = CreateObject ("Scripting.FileSystemObject")
Set oFile = oFS.OpenTextFile (strFile, 1, False)
Do While Not oFile.AtEndOfStream
strLine = Trim (oFile.ReadLine)
If Left (strLine, 1) = "[" Then
strCurrentSection = Mid (strLine, 2, InStr (1, strLine, "]",
1) - 2)
Else
If strLine <> "" And Left (strLine, 1) <> ";" Then
strCurrentKey = Left (strLine, InStr (1, strLine, "=", 1) -
1)
strCurrentValue = Mid (strLine, InStr (1, strLine, "=", 1) +
1)
If LCase (strCurrentSection) = LCase (strSection) Then
If LCase (strCurrentKey) = LCase (strKey) Then
ReadIni = strCurrentValue
Exit Function
ElseIf strKey = "" Then
strReturnValue = strReturnValue & strCurrentKey &
VBCrLf
End If
End If
End If
End If
Loop

If strReturnValue <> "" Then
strReturnValue = Left (strReturnValue, Len (strReturnValue) - 2)
ReadIni = Split (strReturnValue, VBCrLf)
End If

End Function

-- Coupez-ici : ReadIni.vbs --

Exemples :
1- Pour lire la valeur de la clé 'key1' présente dans la section
'section1' du fichier 'iniFile.ini' alors
returnValue = ReadIni ("iniFile.ini", "section1", "key1")
WScript.Echo returnValue

2- Pour lire les noms de toutes les clés de la section 'section1' du
fichier 'iniFile.ini' alors
returnValue = ReadIni ("iniFile.ini", "section1", "")
If IsArray (returnValue) Then
For Each key In returnValue
WScript.Echo key & "=" & ReadIni ("iniFile.ini", "section1",
key)
Next
End If

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
1 2