OVH Cloud OVH Cloud

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

8 réponses

1 2
Avatar
Jacques Barathon [MS]
Je sais que ça ne répond pas directement au besoin (Gilles Laurent a posté
ce matin une réponse qui m'a l'air impeccable), mais voici un bout de code
en PowerShell écrit par Bruce Payette qui permet d'enregistrer les valeurs
d'un fichier INI dans une table de hashage:

--- import-ini.ps1 : couper ici ---
param ($path = $(throw "précisez le chemin complet du fichier INI"))
$result = @{}
switch -regex -f $path
{
'^[.*]'
{
$section = $_.Trim('[]')
if ($result[$section] -ne $null)
{
throw "Section '$section' dupliquée"
}
$result[$section] = $current = @{}
continue
}
'^([^=]+)=(.*)$'
{
$current[$matches[1]] = $matches[2]
}
}
$result
--- couper ici ---

Exemple d'usage:

PS> $system = import-ini $env:windirsystem.ini

Les sections du fichier sont des clés de la table de hashage $system:

PS> $system.keys
386Enh
mci
drivers

... et les valeurs de chaque section sont stockés dans une sous-table de
hashage:

PS> $system.drivers

Name Value
---- -----
wave mmdrv.dll
timer timer.drv

PS> $system.drivers.wave
mmdrv.dll

Jacques

"Pasobo" a écrit dans le message de news:
4501e633$0$8495$
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



Avatar
Th.A.C
Bonjour,

Je viens de tester ton script,

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


peux-tu me mettre la section complète que tu utilises, j'ai peut-être
oublié un truc...

voila un exemple de fichier .ini pour lequel j'avais fait mon script
-----------------------------------------------
[NVL350] # NEC VL350

;Description = Nero 6 pour NEC VL350
;Exe = _Install_Nero6.cmd
;Chemin = Nero
;Parametre = 123456789

Nero 6 pour NEC VL350=_Install_Nero6.cmd,Nero,123456789
test="1234"
test1="1234",azerty,"aaa"
test3 = azertyuiop, blanc en début de ligne,
test4 = " guillement sur 2eme parametre, 2eme parametre", pas de guillemet


[EVO500] # Evo 500

Nero 6 pour NEC VL350=_Install_Nero6.cmd,Nero,123456789
Media Player Classic=_Install (6.4.8.7 fr).cmd, Media Player Classic
-----------------------------------------------



A quoi sert la fonction NettoieLigne ?


a enlever les espaces/tabulations inutiles en début et fin de ligne, et
ne prend pas la ligne en compte si c'est un commentaire dès le début.

Thierry

Avatar
pasoboiv
Merci beaucoup pour le script Laurent,

Et encore merci à tous ceux qui ont bien voulu répondre.

Le script de Laurent fonctionne parfaitement et répond exactement à
mon besoin.

J'essaie de le modifier pour un autre besoin de management :
lire un fichier de type cfg avec des sections
mais où les paramètres ne sont pas sous la forme
[section]
param1=valeur1
param2=valeur2

mais sous la forme
[param1]
valeur1
valeur2
[param2]
valeur1
valeur2

Pascal
Avatar
Michel Claveau
Re !

C'est peut-être parce que le nom de ta section contient des espaces.

Dans ce cas, il faut modifier le batch comme suit :
@echo off
setlocal

set ini=odbc.ini
set section=[dBase Files]

set flagúUX
FOR /F "tokens=*" %%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 /I "%*" EQU "%section%" set flag=VRAI
goto :EOF


Sinon, et si tu as un exemple de fichier .ini de moins de 19 ko, tu
peux le mettre en pièce jointe, en indiquant quelle section tu veux
extraire. Comme ça, on pourra tester.



--
@-salutations

Michel Claveau
Avatar
Pasobo
J'ai testé à partir de ton .ini

Il fonctionne à merveille ton vbs

peux-tu me mettre la section complète que tu utilises, j'ai peut-être
oublié un truc...
Voilà un exemple de fichier .ini que je veux utiliser

--------------------------------------------------
[MapComDrive]
map1=gr1,drv,d
map2=gr2,drv,d
map3=gr3,drv,d

[MapDrive]
map1=gr4,drv,d
map2=gr5,drv,d
map3=gr6,drv,d

[MapComPrt]
map1=gr5,prt,d
-----------------------------------------------

Ton script est complet, surtout dans le test des chaînes de caractères, et
bien doc,

J'ai trouvé que si le paramètre est un caractère unique, il "bloque"

Pour mon besoin, le script de Gilles LAURENT me suffira
mais pour la beauté du geste, et notre culture
si tu trouves pourquoi ça fonctionne pas

Pascal

Avatar
Th.A.C
...
J'ai trouvé que si le paramètre est un caractère unique, il "bloque"


bon j'ai un peu honte, mais j'ai mal prévu un test:
IF Position > 1 THEN

a remplacer par
IF Position >= 1 THEN

que j'aurai peut-être du remplacer par
IF Position > 0 THEN
qui semble plus correcte au niveau de l'analyse

merci de m'avoir rapporté ce bug :-)

Thierry

Avatar
Th.A.C
Houps, encore un bug, mais la je regarderai plus tard:

si un paramètre est vide entre 2 autres paramètres
Avatar
Pasobo
Bonsoir,

Effectivement, difficile de prévoir tous les cas.

M'enfin déjà, je trouve que tu avais poussé assez loin les tests.

Pasobo
1 2