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

[vbs] Lecture variables dans un .ini

16 réponses
Avatar
Youri Ligotmi
Bonjour à tous

J'ai une série de scripts vbs qui font référence à des chemins d'accès
(une 15aine). Jusqu'à présent ces chemins sont déclarés en tête de
chaque script.
C'est un peu idiot dans la mesure où je dois répéter inutilement ces
lignes et surtout il y a un risque d'incohérence.
Ce que je voudrais c'est déclarer ces chemins une fois pour toute dans
un fichier ini que tous mes scripts viendraient lire au début de leur
exécution.
Le fichier ini serait de la forme
chemin1 = c:\temp\essai
...
Avec un split autour du égal je peux ensuite récupérer le nom de la
variable et son contenu.
ma question : comment affecter le nom de variable et le contenu? Il me
semble avoir vu passer un truc du genre varialble execute mais
impossible a retrouver.

Quelqu'un connait?

Merci d'avance

6 réponses

1 2
Avatar
Gilles LAURENT [MVP]
Bonjour,

Ci-dessous une nouvelle version qui permet le traitement séquenciel des
lignes présentes dans le fichier de configuration ainsi qu'un contrôle de
cohérence des variables à charger via une expression régulière. Bien que les
variables soient dynamiquement déclarées (Dimmed) à l'intérieur de la
fonction LoadPathFromIni, les variables possèdent une portée globale
(ExecuteGlobal).

Jérome : Les chemins ne sont plus encadrés par des guillemets dans le
fichier de configuration et il y a un affichage de la progression du
traitement ;-)

Michel_D : Merci pour avoir relayé mon Post initial ainsi que pour avoir
fait évoluer le code

Avec tout cela, je pense que l'usager est bien outillé ;-)

--- pathdef.ini ---
chemin1 = d:testessai1
chemin2 = d:testessai2
--- pathdef.ini ---

--- LoadPathFromIni.vbs ---
Option Explicit

Function LoadPathFromIni(strIniFile)

Dim oFs, oRe, oFile
Dim strDef, strVarName, strVarValue
Dim bRet: bRet=True

Set oFs=CreateObject("Scripting.FileSystemObject")
Set oRe=New RegExp
oRe.Pattern="^([aA-zZ][w_]+)s*?=s*?(w:[^/:*?<>|]+$)"

If oFs.FileExists(strIniFile) Then
Set oFile=oFs.OpenTextFile (strIniFile)
For Each strDef In Split(oFile.ReadAll(), VBCrLf)
If oRe.Test(strDef) Then
strVarName=oRe.Execute(strDef)(0).SubMatches(0)
strVarValue=oRe.Execute(strDef)(0).SubMatches(1)
WScript.Echo "Log: " & strVarName & "=" & strVarValue
ExecuteGlobal("Dim " & strVarName & ":" & _
strVarName & "=" & Chr(34) & strVarValue & Chr(34))
Else
If strDef<>"" And Left(strDef,1)<>";" Then
WScript.Echo "Mismatch: " & strDef
bRetúlse
End If
End If
Next
Else
WScript.Echo "File not found: " & strIniFile
bRetúlse
End If

LoadPathFromIni=bRet

End Function

If Not LoadPathFromIni("d:testpathdef.ini") Then
WScript.Echo "Kernel panic !!"
WScript.Quit
End If

WScript.Echo chemin1
WScript.Echo chemin2
--- LoadPathFromIni.vbs ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr



"Michel_D" wrote:

Bonjour,

"Michel_D" a écrit dans le message
de news:%
Bonjour,

"Youri Ligotmi" a écrit dans le message de
news:4826bf67$0$30943$
Bonjour à tous

J'ai une série de scripts vbs qui font référence à des chemins
d'accès (une 15aine). Jusqu'à présent ces chemins sont déclarés en
tête de chaque script.
C'est un peu idiot dans la mesure où je dois répéter inutilement
ces lignes et surtout il y a un risque d'incohérence.
Ce que je voudrais c'est déclarer ces chemins une fois pour toute
dans un fichier ini que tous mes scripts viendraient lire au début
de leur exécution.
Le fichier ini serait de la forme
chemin1 = c:tempessai
...
Avec un split autour du égal je peux ensuite récupérer le nom de la
variable et son contenu.
ma question : comment affecter le nom de variable et le contenu? Il
me semble avoir vu passer un truc du genre varialble execute mais
impossible a retrouver.

Quelqu'un connait?

Merci d'avance



Un exemple sous forme de deux subs, mais je ne suis pas sûr d'avoir
bien compris la demande:
# -- Début
Option Explicit

Sub ReadVarsFromFile(IniFile)
Dim i, Fso, objIni, arrtmp
Set Fso = CreateObject("Scripting.FileSystemObject")
Set ObjIni = Fso.OpenTextFile(IniFile, 1)
Do Until objIni.AtEndOfStream
arrtmp = Split(objIni.ReadLine, "=")
Call MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1)))
Loop
objIni.Close
Set objIni = Nothing
Set Fso = Nothing
End Sub

Sub MakeDynamicVar(VarName, VarValue)
Dim Nametmp
Nametmp = VarName
Execute("Dim " & VarName)
VarName = VarValue
Wscript.Echo Nametmp & " = " & VarName
End Sub

Call ReadVarsFromFile("D:Scriptspaths.ini")


Effectivement ma demande n'était pas très claire, votre réponse,
elle, est parfaite : c'est exactement ce que je recherchais.



Moi je serais toi je regarderai la portée des variables ainsi crées
(à cause du Dim) et je suis pas sur que ce soit ce que tu recherche.

La proposition de Gilles n'a pas ce problème ou si tu tiens à tes Dim,
tu crée une chaîne de caractére correspondant au code qui doit être
exécuté et tu l'exécute à l'extérieur de toutes procédures/fonctions.



Bien vu en ce qui concerne la portée, il suffit de sortir le code des
subs (ce qui était la version d'origine, mais je la trouvait brouillon
après avoir ajouté les lignes pour afficher le résultat) et dans la
boucle mettre à la place de Call MakeDynamicVar(Trim(arrtmp(0)),
Trim(arrtmp(1))) les deux lignes suivantes (non testé pour le deuxième
Execute):
Execute("Dim " & Trim(arrtmp(0)))
Execute(Trim(arrtmp(0)) & "=" & Trim(arrtmp(1)))
Le code ici était juste pour montrer la création dynamique de variables,
maintenant on a l'exemple de l'affectation de valeurs aux variables ;-)
Comme il est convenu (en tout cas dans les best practice de MS)
d'utiliser un Option Explicit, si on ne créé pas dynamiquement les
variables, soit il faut déclarer des variables 'génériques' du style
strVar1, strVar2 ce qui rend le code m....dique, soit éditer tous les
fichiers qui font appel au variables du fichier .ini
Avec le code proposé, on peut facilement ajouter dans la boucle un If
Not fso.FileExists(Nom-De-La-Variable) ou préfixer les noms de variables
pour traitement particulier, etc.
Attention, je ne dis pas que le code de Gilles n'est pas bon (manquerait
plus que ça), d'ailleurs j'avais commencé avec un Execute du readAll,
mais l'obligation d'encadrer les chemins entre double guillemets ne me
plaisait pas et je tenais à un affichage en sortie de ce qui se passe,
ce que je ne suis pas arrivé à faire avec l'Execute du readAll, Gilles ?
;-)


Sur la base du code de Gilles, je trouve le code suivant plus simple, car
il y a à mon avis aucun intérét à décomposer le contenu du fichier .ini.


--- PathDef.ini ---
Dim chemin1, chemin2
chemin1 = "c:tempessai1"
chemin2 = "c:tempessai2"
--- PathDef.ini ---

--- portion de code à placer en tête de script ---
Dim strIniFile

strIniFile="D:TestPathDef.ini"
Set oFs=CreateObject("Scripting.FileSystemObject")

If oFs.FileExists(strIniFile) Then
Set oFile=oFs.OpenTextFile(strIniFile)
Execute oFile.ReadAll()
Else
Msgbox "Le fichier (.ini) n'a pas été trouvé !!!"
WScript.Quit
End If

Set oFile=Nothing
Set oFs=Nothing ' Si l'on ne s'en sert plus

WScript.Echo chemin1
WScript.Echo chemin2
--- fin de la portion ---








Avatar
Youri Ligotmi
Bonjour,

"Michel_D" a écrit dans le
message de news:%
Bonjour,

"Youri Ligotmi" a écrit dans le message de
news:4826bf67$0$30943$
Bonjour à tous

J'ai une série de scripts vbs qui font référence à des chemins
d'accès (une 15aine). Jusqu'à présent ces chemins sont déclarés en
tête de chaque script.
C'est un peu idiot dans la mesure où je dois répéter inutilement
ces lignes et surtout il y a un risque d'incohérence.
Ce que je voudrais c'est déclarer ces chemins une fois pour toute
dans un fichier ini que tous mes scripts viendraient lire au début
de leur exécution.
Le fichier ini serait de la forme
chemin1 = c:tempessai
...
Avec un split autour du égal je peux ensuite récupérer le nom de
la variable et son contenu.
ma question : comment affecter le nom de variable et le contenu?
Il me semble avoir vu passer un truc du genre varialble execute
mais impossible a retrouver.

Quelqu'un connait?

Merci d'avance



Un exemple sous forme de deux subs, mais je ne suis pas sûr
d'avoir bien compris la demande:
# -- Début
Option Explicit

Sub ReadVarsFromFile(IniFile)
Dim i, Fso, objIni, arrtmp
Set Fso = CreateObject("Scripting.FileSystemObject")
Set ObjIni = Fso.OpenTextFile(IniFile, 1)
Do Until objIni.AtEndOfStream
arrtmp = Split(objIni.ReadLine, "=")
Call MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1)))
Loop
objIni.Close
Set objIni = Nothing
Set Fso = Nothing
End Sub

Sub MakeDynamicVar(VarName, VarValue)
Dim Nametmp
Nametmp = VarName
Execute("Dim " & VarName)
VarName = VarValue
Wscript.Echo Nametmp & " = " & VarName
End Sub

Call ReadVarsFromFile("D:Scriptspaths.ini")


Effectivement ma demande n'était pas très claire, votre réponse,
elle, est parfaite : c'est exactement ce que je recherchais.



Moi je serais toi je regarderai la portée des variables ainsi crées
(à cause du Dim) et je suis pas sur que ce soit ce que tu recherche.

La proposition de Gilles n'a pas ce problème ou si tu tiens à tes Dim,
tu crée une chaîne de caractére correspondant au code qui doit être
exécuté et tu l'exécute à l'extérieur de toutes procédures/fonctions.



Bien vu en ce qui concerne la portée, il suffit de sortir le code des
subs (ce qui était la version d'origine, mais je la trouvait brouillon
après avoir ajouté les lignes pour afficher le résultat) et dans la
boucle mettre à la place de Call MakeDynamicVar(Trim(arrtmp(0)),
Trim(arrtmp(1))) les deux lignes suivantes (non testé pour le deuxième
Execute):
Execute("Dim " & Trim(arrtmp(0)))
Execute(Trim(arrtmp(0)) & "=" & Trim(arrtmp(1)))
Le code ici était juste pour montrer la création dynamique de
variables, maintenant on a l'exemple de l'affectation de valeurs aux
variables ;-)
Comme il est convenu (en tout cas dans les best practice de MS)
d'utiliser un Option Explicit, si on ne créé pas dynamiquement les
variables, soit il faut déclarer des variables 'génériques' du style
strVar1, strVar2 ce qui rend le code m....dique, soit éditer tous les
fichiers qui font appel au variables du fichier .ini
Avec le code proposé, on peut facilement ajouter dans la boucle un If
Not fso.FileExists(Nom-De-La-Variable) ou préfixer les noms de
variables pour traitement particulier, etc.
Attention, je ne dis pas que le code de Gilles n'est pas bon
(manquerait plus que ça), d'ailleurs j'avais commencé avec un Execute
du readAll, mais l'obligation d'encadrer les chemins entre double
guillemets ne me plaisait pas et je tenais à un affichage en sortie de
ce qui se passe, ce que je ne suis pas arrivé à faire avec l'Execute
du readAll, Gilles ? ;-)


Sur la base du code de Gilles, je trouve le code suivant plus simple, car
il y a à mon avis aucun intérét à décomposer le contenu du fichier .ini.


--- PathDef.ini ---
Dim chemin1, chemin2
chemin1 = "c:tempessai1"
chemin2 = "c:tempessai2"
--- PathDef.ini ---

--- portion de code à placer en tête de script ---
Dim strIniFile

strIniFile="D:TestPathDef.ini"
Set oFs=CreateObject("Scripting.FileSystemObject")

If oFs.FileExists(strIniFile) Then
Set oFile=oFs.OpenTextFile(strIniFile)
Execute oFile.ReadAll()
Else
Msgbox "Le fichier (.ini) n'a pas été trouvé !!!"
WScript.Quit
End If

Set oFile=Nothing
Set oFs=Nothing ' Si l'on ne s'en sert plus

WScript.Echo chemin1
WScript.Echo chemin2
--- fin de la portion ---


Tout comptes faits je suis revenu au code de jbongran (en sortant le
code des sub), juste parce que je voulais pouvoir documenter mon ini par
des lignes de commentaires, ces lignes générant des erreurs dans le ReadAll






Avatar
Gilles LAURENT [MVP]
"Youri Ligotmi" a écrit dans le message de
news:482acb00$0$17508$
|| Bonjour,
||
||| "Michel_D" a écrit dans le
||| message de news:%
|||| Bonjour,
||||
|||||| "Youri Ligotmi" a écrit dans le message de
|||||| news:4826bf67$0$30943$
||||||| Bonjour à tous
|||||||
||||||| J'ai une série de scripts vbs qui font référence à des chemins
||||||| d'accès (une 15aine). Jusqu'à présent ces chemins sont déclarés
||||||| en tête de chaque script.
||||||| C'est un peu idiot dans la mesure où je dois répéter inutilement
||||||| ces lignes et surtout il y a un risque d'incohérence.
||||||| Ce que je voudrais c'est déclarer ces chemins une fois pour
||||||| toute dans un fichier ini que tous mes scripts viendraient lire
||||||| au début de leur exécution.
||||||| Le fichier ini serait de la forme
||||||| chemin1 = c:tempessai
||||||| ...
||||||| Avec un split autour du égal je peux ensuite récupérer le nom de
||||||| la variable et son contenu.
||||||| ma question : comment affecter le nom de variable et le contenu?
||||||| Il me semble avoir vu passer un truc du genre varialble execute
||||||| mais impossible a retrouver.
|||||||
||||||| Quelqu'un connait?
|||||||
||||||| Merci d'avance
||||||
||||||
|||||| Un exemple sous forme de deux subs, mais je ne suis pas sûr
|||||| d'avoir bien compris la demande:
|||||| # -- Début
|||||| Option Explicit
||||||
|||||| Sub ReadVarsFromFile(IniFile)
|||||| Dim i, Fso, objIni, arrtmp
|||||| Set Fso = CreateObject("Scripting.FileSystemObject")
|||||| Set ObjIni = Fso.OpenTextFile(IniFile, 1)
|||||| Do Until objIni.AtEndOfStream
|||||| arrtmp = Split(objIni.ReadLine, "=")
|||||| Call MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1)))
|||||| Loop
|||||| objIni.Close
|||||| Set objIni = Nothing
|||||| Set Fso = Nothing
|||||| End Sub
||||||
|||||| Sub MakeDynamicVar(VarName, VarValue)
|||||| Dim Nametmp
|||||| Nametmp = VarName
|||||| Execute("Dim " & VarName)
|||||| VarName = VarValue
|||||| Wscript.Echo Nametmp & " = " & VarName
|||||| End Sub
||||||
|||||| Call ReadVarsFromFile("D:Scriptspaths.ini")
|||||
||||| Effectivement ma demande n'était pas très claire, votre réponse,
||||| elle, est parfaite : c'est exactement ce que je recherchais.
||||
||||
|||| Moi je serais toi je regarderai la portée des variables ainsi crées
|||| (à cause du Dim) et je suis pas sur que ce soit ce que tu
|||| recherche.
||||
|||| La proposition de Gilles n'a pas ce problème ou si tu tiens à tes
|||| Dim, tu crée une chaîne de caractére correspondant au code qui
|||| doit être exécuté et tu l'exécute à l'extérieur de toutes
|||| procédures/fonctions.
|||
|||
||| Bien vu en ce qui concerne la portée, il suffit de sortir le code
||| des subs (ce qui était la version d'origine, mais je la trouvait
||| brouillon après avoir ajouté les lignes pour afficher le résultat)
||| et dans la boucle mettre à la place de Call
||| MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1))) les deux lignes
||| suivantes (non testé pour le deuxième Execute):
||| Execute("Dim " & Trim(arrtmp(0)))
||| Execute(Trim(arrtmp(0)) & "=" & Trim(arrtmp(1)))
||| Le code ici était juste pour montrer la création dynamique de
||| variables, maintenant on a l'exemple de l'affectation de valeurs aux
||| variables ;-)
||| Comme il est convenu (en tout cas dans les best practice de MS)
||| d'utiliser un Option Explicit, si on ne créé pas dynamiquement les
||| variables, soit il faut déclarer des variables 'génériques' du style
||| strVar1, strVar2 ce qui rend le code m....dique, soit éditer tous
||| les fichiers qui font appel au variables du fichier .ini
||| Avec le code proposé, on peut facilement ajouter dans la boucle un
||| If Not fso.FileExists(Nom-De-La-Variable) ou préfixer les noms de
||| variables pour traitement particulier, etc.
||| Attention, je ne dis pas que le code de Gilles n'est pas bon
||| (manquerait plus que ça), d'ailleurs j'avais commencé avec un
||| Execute du readAll, mais l'obligation d'encadrer les chemins entre
||| double guillemets ne me plaisait pas et je tenais à un affichage en
||| sortie de ce qui se passe, ce que je ne suis pas arrivé à faire
||| avec l'Execute du readAll, Gilles ? ;-)
||
|| Sur la base du code de Gilles, je trouve le code suivant plus
|| simple, car il y a à mon avis aucun intérét à décomposer le contenu
|| du fichier .ini.
||
||
|| --- PathDef.ini ---
|| Dim chemin1, chemin2
|| chemin1 = "c:tempessai1"
|| chemin2 = "c:tempessai2"
|| --- PathDef.ini ---
||
|| --- portion de code à placer en tête de script ---
|| Dim strIniFile
||
|| strIniFile="D:TestPathDef.ini"
|| Set oFs=CreateObject("Scripting.FileSystemObject")
||
|| If oFs.FileExists(strIniFile) Then
|| Set oFile=oFs.OpenTextFile(strIniFile)
|| Execute oFile.ReadAll()
|| Else
|| Msgbox "Le fichier (.ini) n'a pas été trouvé !!!"
|| WScript.Quit
|| End If
||
|| Set oFile=Nothing
|| Set oFs=Nothing ' Si l'on ne s'en sert plus
||
|| WScript.Echo chemin1
|| WScript.Echo chemin2
|| --- fin de la portion ---
|
| Tout comptes faits je suis revenu au code de jbongran (en sortant le
| code des sub), juste parce que je voulais pouvoir documenter mon ini
| par des lignes de commentaires, ces lignes générant des erreurs dans
| le ReadAll

Il suffit d'utiliser le caractère de commentaire VBScript ;-)

--- PathDef.ini ---
' initialisation des variables définies dynamiquement
' la portée est globale
Dim chemin1, chemin2

' définition du chemin d'accès à la base de données
chemin1 = "c:tempessai1"

' définition du chemin d'accès aux fichiers logs
' ce dossier est en accès RW
chemin2 = "c:tempessai2"
--- PathDef.ini ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
jbongran
"Gilles LAURENT [MVP]" a écrit dans le message de
news:
[...]
Jérome : Les chemins ne sont plus encadrés par des guillemets dans le
fichier de configuration et il y a un affichage de la progression du
traitement ;-)
[...]


Je savait bien qu'en te poussant un peu tu prendrai en compte mes remarques
;-)
En tout cas, j'aime beaucoup le "kernel panic"

Avatar
jbongran
"Michel_D" a écrit dans le message de
news:
Bonjour,

"Michel_D" a écrit dans le message
de news:%
Bonjour,

"Youri Ligotmi" a écrit dans le message de
news:4826bf67$0$30943$
Bonjour à tous

J'ai une série de scripts vbs qui font référence à des chemins
d'accès (une 15aine). Jusqu'à présent ces chemins sont déclarés en
tête de chaque script.
C'est un peu idiot dans la mesure où je dois répéter inutilement ces
lignes et surtout il y a un risque d'incohérence.
Ce que je voudrais c'est déclarer ces chemins une fois pour toute
dans un fichier ini que tous mes scripts viendraient lire au début de
leur exécution.
Le fichier ini serait de la forme
chemin1 = c:tempessai
...
Avec un split autour du égal je peux ensuite récupérer le nom de la
variable et son contenu.
ma question : comment affecter le nom de variable et le contenu? Il
me semble avoir vu passer un truc du genre varialble execute mais
impossible a retrouver.

Quelqu'un connait?

Merci d'avance



Un exemple sous forme de deux subs, mais je ne suis pas sûr d'avoir
bien compris la demande:
# -- Début
Option Explicit

Sub ReadVarsFromFile(IniFile)
Dim i, Fso, objIni, arrtmp
Set Fso = CreateObject("Scripting.FileSystemObject")
Set ObjIni = Fso.OpenTextFile(IniFile, 1)
Do Until objIni.AtEndOfStream
arrtmp = Split(objIni.ReadLine, "=")
Call MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1)))
Loop
objIni.Close
Set objIni = Nothing
Set Fso = Nothing
End Sub

Sub MakeDynamicVar(VarName, VarValue)
Dim Nametmp
Nametmp = VarName
Execute("Dim " & VarName)
VarName = VarValue
Wscript.Echo Nametmp & " = " & VarName
End Sub

Call ReadVarsFromFile("D:Scriptspaths.ini")


Effectivement ma demande n'était pas très claire, votre réponse, elle,
est parfaite : c'est exactement ce que je recherchais.



Moi je serais toi je regarderai la portée des variables ainsi crées
(à cause du Dim) et je suis pas sur que ce soit ce que tu recherche.

La proposition de Gilles n'a pas ce problème ou si tu tiens à tes Dim,
tu crée une chaîne de caractére correspondant au code qui doit être
exécuté et tu l'exécute à l'extérieur de toutes procédures/fonctions.



Bien vu en ce qui concerne la portée, il suffit de sortir le code des
subs (ce qui était la version d'origine, mais je la trouvait brouillon
après avoir ajouté les lignes pour afficher le résultat) et dans la
boucle mettre à la place de Call MakeDynamicVar(Trim(arrtmp(0)),
Trim(arrtmp(1))) les deux lignes suivantes (non testé pour le deuxième
Execute):
Execute("Dim " & Trim(arrtmp(0)))
Execute(Trim(arrtmp(0)) & "=" & Trim(arrtmp(1)))
Le code ici était juste pour montrer la création dynamique de variables,
maintenant on a l'exemple de l'affectation de valeurs aux variables ;-)
Comme il est convenu (en tout cas dans les best practice de MS)
d'utiliser un Option Explicit, si on ne créé pas dynamiquement les
variables, soit il faut déclarer des variables 'génériques' du style
strVar1, strVar2 ce qui rend le code m....dique, soit éditer tous les
fichiers qui font appel au variables du fichier .ini
Avec le code proposé, on peut facilement ajouter dans la boucle un If Not
fso.FileExists(Nom-De-La-Variable) ou préfixer les noms de variables pour
traitement particulier, etc.
Attention, je ne dis pas que le code de Gilles n'est pas bon (manquerait
plus que ça), d'ailleurs j'avais commencé avec un Execute du readAll,
mais l'obligation d'encadrer les chemins entre double guillemets ne me
plaisait pas et je tenais à un affichage en sortie de ce qui se passe, ce
que je ne suis pas arrivé à faire avec l'Execute du readAll, Gilles ? ;-)


Sur la base du code de Gilles, je trouve le code suivant plus simple, car
il y a à mon avis aucun intérét à décomposer le contenu du fichier .ini.


--- PathDef.ini ---
Dim chemin1, chemin2
chemin1 = "c:tempessai1"
chemin2 = "c:tempessai2"
--- PathDef.ini ---

--- portion de code à placer en tête de script ---
Dim strIniFile

strIniFile="D:TestPathDef.ini"
Set oFs=CreateObject("Scripting.FileSystemObject")

If oFs.FileExists(strIniFile) Then
Set oFile=oFs.OpenTextFile(strIniFile)
Execute oFile.ReadAll()
Else
Msgbox "Le fichier (.ini) n'a pas été trouvé !!!"
WScript.Quit
End If

Set oFile=Nothing
Set oFs=Nothing ' Si l'on ne s'en sert plus

WScript.Echo chemin1
WScript.Echo chemin2
--- fin de la portion ---



On peut épiloguer des heures sur l'intérêt de tel ou tel contrôle...
Si on vérifie l'existence physique du fichier ini pourquoi ne pas tester la
présence des fichiers et/ou dossiers déclaré dedans ?
Question d'approche et d'une ligne à ajouter que ce soit dans mon code ou
celui de Gilles (la V2).






Avatar
Youri Ligotmi
"Youri Ligotmi" a écrit dans le message de
news:482acb00$0$17508$
|| Bonjour,
||
||| "Michel_D" a écrit dans le
||| message de news:%
|||| Bonjour,
||||
|||||| "Youri Ligotmi" a écrit dans le message de
|||||| news:4826bf67$0$30943$
||||||| Bonjour à tous
|||||||
||||||| J'ai une série de scripts vbs qui font référence à des chemins
||||||| d'accès (une 15aine). Jusqu'à présent ces chemins sont déclarés
||||||| en tête de chaque script.
||||||| C'est un peu idiot dans la mesure où je dois répéter inutilement
||||||| ces lignes et surtout il y a un risque d'incohérence.
||||||| Ce que je voudrais c'est déclarer ces chemins une fois pour
||||||| toute dans un fichier ini que tous mes scripts viendraient lire
||||||| au début de leur exécution.
||||||| Le fichier ini serait de la forme
||||||| chemin1 = c:tempessai
||||||| ...
||||||| Avec un split autour du égal je peux ensuite récupérer le nom de
||||||| la variable et son contenu.
||||||| ma question : comment affecter le nom de variable et le contenu?
||||||| Il me semble avoir vu passer un truc du genre varialble execute
||||||| mais impossible a retrouver.
|||||||
||||||| Quelqu'un connait?
|||||||
||||||| Merci d'avance
||||||
||||||
|||||| Un exemple sous forme de deux subs, mais je ne suis pas sûr
|||||| d'avoir bien compris la demande:
|||||| # -- Début
|||||| Option Explicit
||||||
|||||| Sub ReadVarsFromFile(IniFile)
|||||| Dim i, Fso, objIni, arrtmp
|||||| Set Fso = CreateObject("Scripting.FileSystemObject")
|||||| Set ObjIni = Fso.OpenTextFile(IniFile, 1)
|||||| Do Until objIni.AtEndOfStream
|||||| arrtmp = Split(objIni.ReadLine, "=")
|||||| Call MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1)))
|||||| Loop
|||||| objIni.Close
|||||| Set objIni = Nothing
|||||| Set Fso = Nothing
|||||| End Sub
||||||
|||||| Sub MakeDynamicVar(VarName, VarValue)
|||||| Dim Nametmp
|||||| Nametmp = VarName
|||||| Execute("Dim " & VarName)
|||||| VarName = VarValue
|||||| Wscript.Echo Nametmp & " = " & VarName
|||||| End Sub
||||||
|||||| Call ReadVarsFromFile("D:Scriptspaths.ini")
|||||
||||| Effectivement ma demande n'était pas très claire, votre réponse,
||||| elle, est parfaite : c'est exactement ce que je recherchais.
||||
||||
|||| Moi je serais toi je regarderai la portée des variables ainsi crées
|||| (à cause du Dim) et je suis pas sur que ce soit ce que tu
|||| recherche.
||||
|||| La proposition de Gilles n'a pas ce problème ou si tu tiens à tes
|||| Dim, tu crée une chaîne de caractére correspondant au code qui
|||| doit être exécuté et tu l'exécute à l'extérieur de toutes
|||| procédures/fonctions.
|||
|||
||| Bien vu en ce qui concerne la portée, il suffit de sortir le code
||| des subs (ce qui était la version d'origine, mais je la trouvait
||| brouillon après avoir ajouté les lignes pour afficher le résultat)
||| et dans la boucle mettre à la place de Call
||| MakeDynamicVar(Trim(arrtmp(0)), Trim(arrtmp(1))) les deux lignes
||| suivantes (non testé pour le deuxième Execute):
||| Execute("Dim " & Trim(arrtmp(0)))
||| Execute(Trim(arrtmp(0)) & "=" & Trim(arrtmp(1)))
||| Le code ici était juste pour montrer la création dynamique de
||| variables, maintenant on a l'exemple de l'affectation de valeurs aux
||| variables ;-)
||| Comme il est convenu (en tout cas dans les best practice de MS)
||| d'utiliser un Option Explicit, si on ne créé pas dynamiquement les
||| variables, soit il faut déclarer des variables 'génériques' du style
||| strVar1, strVar2 ce qui rend le code m....dique, soit éditer tous
||| les fichiers qui font appel au variables du fichier .ini
||| Avec le code proposé, on peut facilement ajouter dans la boucle un
||| If Not fso.FileExists(Nom-De-La-Variable) ou préfixer les noms de
||| variables pour traitement particulier, etc.
||| Attention, je ne dis pas que le code de Gilles n'est pas bon
||| (manquerait plus que ça), d'ailleurs j'avais commencé avec un
||| Execute du readAll, mais l'obligation d'encadrer les chemins entre
||| double guillemets ne me plaisait pas et je tenais à un affichage en
||| sortie de ce qui se passe, ce que je ne suis pas arrivé à faire
||| avec l'Execute du readAll, Gilles ? ;-)
||
|| Sur la base du code de Gilles, je trouve le code suivant plus
|| simple, car il y a à mon avis aucun intérét à décomposer le contenu
|| du fichier .ini.
||
||
|| --- PathDef.ini ---
|| Dim chemin1, chemin2
|| chemin1 = "c:tempessai1"
|| chemin2 = "c:tempessai2"
|| --- PathDef.ini ---
||
|| --- portion de code à placer en tête de script ---
|| Dim strIniFile
||
|| strIniFile="D:TestPathDef.ini"
|| Set oFs=CreateObject("Scripting.FileSystemObject")
||
|| If oFs.FileExists(strIniFile) Then
|| Set oFile=oFs.OpenTextFile(strIniFile)
|| Execute oFile.ReadAll()
|| Else
|| Msgbox "Le fichier (.ini) n'a pas été trouvé !!!"
|| WScript.Quit
|| End If
||
|| Set oFile=Nothing
|| Set oFs=Nothing ' Si l'on ne s'en sert plus
||
|| WScript.Echo chemin1
|| WScript.Echo chemin2
|| --- fin de la portion ---
|
| Tout comptes faits je suis revenu au code de jbongran (en sortant le
| code des sub), juste parce que je voulais pouvoir documenter mon ini
| par des lignes de commentaires, ces lignes générant des erreurs dans
| le ReadAll

Il suffit d'utiliser le caractère de commentaire VBScript ;-)


Bien sûr! quel con je fais avec en plus ma mauvaise habitude de faire
commencer mes lignes de commentaires par des #.
Merci ça marche impec.

1 2