Question Importer un fichier INI dans un tableau
- Jacques Barathon
- Auteur du sujet
- Hors Ligne
- Administrateur
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 17 ans 5 mois #712
par Jacques Barathon
Importer un fichier INI dans un tableau a été créé par Jacques Barathon
Pour celles et ceux qui ne suivent pas mon blog, je me permets de reposter ici le script import-ini dont j'ai parlé hier:
[code:1]
# import-ini.ps1
param ($file)
$ini = @{}
switch -regex -file $file
{
\"^\[(.+)\]$\"
{
$section = $matches[1]
$ini[$section] = @{}
}
\"(.+)=(.*)\"
{
$name, $value = $matches[1..2]
$ini[$section][$name] = $value
}
}
$ini [/code:1]
La commande switch (-regex -file $file) {...} parcourt le fichier $file ligne par ligne. Elle évalue la ligne selon chacune des expressions régulières qui sont ensuite proposées, et si l'évaluation d'une expression régulière s'avère positive le code qui suit est exécuté.
Cette commande me permet de parcourir le fichier à la recherche des deux types de ligne qu'on peut rencontrer dans un fichier INI:
* l'en-tête de section au format [nom de section]
Dans ce cas, je prends la chaîne entre crochets et j'en fais mon nouveau nom de section. J'ajoute à mon tableau global un nouveau tableau avec ce nom de section comme clé de hachage.
* le couple nom = valeur
Dans ce cas, je crèe une entrée dans mon tableau de section, avec le nom comme clé et la valeur comme... valeur.
J'ai écrit ce script assez rapidement et je ne l'ai pas testé avec beaucoup de fichiers. Il est donc probable qu'il y ait des bugs avec certaines entrées particulières. Mais tel quel, il devrait marcher dans la plupart des cas.
Prenons le fichier servers.ini fictif suivant:
[code:1]
[ExchangeServer]
server1=srv-msg-01
server2=srv-msg-02
server3=srv-msg-03
[DomainController]
server1=srv-dc-01
server2=srv-dc-02
server3=srv-dc-03[/code:1]
On pourra l'importer et accéder à ses valeurs ainsi:
[code:1]
PS> $servers = import-ini servers.ini
# 1ere syntaxe possible:
PS> $servers.DomainController.server1
srv-dc-01
# 2e syntaxe possible:
PS> $servers[\"ExchangeServer\"][\"server2\"]
srv-msg-02
# On peut même mélanger les styles:
PS> $servers[\"ExchangeServer\"].server3
srv-msg-03
# Un exemple d'utilisation de variable:
PS> $role = \"DomainController\"
PS> $servers.$role
Name Value
----
server2 srv-dc-02
server1 srv-dc-01
server3 srv-dc-03[/code:1]
Voilà, j'espère que ça vous sera utile.
Pour info, le billet correspondant sur mon blog:
janel.spaces.live.com/blog/cns!9B5AA3F6FA0088C2!312.entry
Janel<br><br>Message édité par: janel, à: 22/07/07 09:37
[code:1]
# import-ini.ps1
param ($file)
$ini = @{}
switch -regex -file $file
{
\"^\[(.+)\]$\"
{
$section = $matches[1]
$ini[$section] = @{}
}
\"(.+)=(.*)\"
{
$name, $value = $matches[1..2]
$ini[$section][$name] = $value
}
}
$ini [/code:1]
La commande switch (-regex -file $file) {...} parcourt le fichier $file ligne par ligne. Elle évalue la ligne selon chacune des expressions régulières qui sont ensuite proposées, et si l'évaluation d'une expression régulière s'avère positive le code qui suit est exécuté.
Cette commande me permet de parcourir le fichier à la recherche des deux types de ligne qu'on peut rencontrer dans un fichier INI:
* l'en-tête de section au format [nom de section]
Dans ce cas, je prends la chaîne entre crochets et j'en fais mon nouveau nom de section. J'ajoute à mon tableau global un nouveau tableau avec ce nom de section comme clé de hachage.
* le couple nom = valeur
Dans ce cas, je crèe une entrée dans mon tableau de section, avec le nom comme clé et la valeur comme... valeur.
J'ai écrit ce script assez rapidement et je ne l'ai pas testé avec beaucoup de fichiers. Il est donc probable qu'il y ait des bugs avec certaines entrées particulières. Mais tel quel, il devrait marcher dans la plupart des cas.
Prenons le fichier servers.ini fictif suivant:
[code:1]
[ExchangeServer]
server1=srv-msg-01
server2=srv-msg-02
server3=srv-msg-03
[DomainController]
server1=srv-dc-01
server2=srv-dc-02
server3=srv-dc-03[/code:1]
On pourra l'importer et accéder à ses valeurs ainsi:
[code:1]
PS> $servers = import-ini servers.ini
# 1ere syntaxe possible:
PS> $servers.DomainController.server1
srv-dc-01
# 2e syntaxe possible:
PS> $servers[\"ExchangeServer\"][\"server2\"]
srv-msg-02
# On peut même mélanger les styles:
PS> $servers[\"ExchangeServer\"].server3
srv-msg-03
# Un exemple d'utilisation de variable:
PS> $role = \"DomainController\"
PS> $servers.$role
Name Value
----
server2 srv-dc-02
server1 srv-dc-01
server3 srv-dc-03[/code:1]
Voilà, j'espère que ça vous sera utile.
Pour info, le billet correspondant sur mon blog:
janel.spaces.live.com/blog/cns!9B5AA3F6FA0088C2!312.entry
Janel<br><br>Message édité par: janel, à: 22/07/07 09:37
Connexion ou Créer un compte pour participer à la conversation.
- Robin Lemesle
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 260
- Remerciements reçus 0
il y a 17 ans 5 mois #715
par Robin Lemesle
Robin MVP PowerShell
Réponse de Robin Lemesle sur le sujet Re:Importer un fichier INI dans un tableau
Encore une fois, merci Janel
Si tu nous donnes ton accord, nous pourrions le mettre dans la bibliothèque de scripts pour qu'il soit bien visible.
Rob<br><br>Message édité par: robin, à: 22/07/07 13:34
Si tu nous donnes ton accord, nous pourrions le mettre dans la bibliothèque de scripts pour qu'il soit bien visible.
Rob<br><br>Message édité par: robin, à: 22/07/07 13:34
Robin MVP PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Auteur du sujet
- Hors Ligne
- Administrateur
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 17 ans 5 mois #719
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Importer un fichier INI dans un tableau
Aucun problème.
Janel
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 17 ans 5 mois #720
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Importer un fichier INI dans un tableau
C'est un excellent script !
Merci Janel
Merci Janel
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 15 ans 10 mois #4196
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Importer un fichier INI dans un tableau
Bonjour tout le monde,
J'espère que Jamel ne m'en voudra pas de modifier sa fonction.
Je trouve cette fonction vraiment très pratique et très bien conçu.
Par contre j'ai eu d'autre besoin dans mes développements qui ont entrainé de petite modification.
Donc peut-être que d'autre ont eu le même besoin.
[code:1]Function Import-Ini {
param ($file)
$ini = @{}
$ok = $true
switch -regex -file $file
{
\"^\[(.+)\]$\" {
$section = $matches[1]
$ini[$section] = @{}
$i = 0
}
\"^([^=]+)={1}([^=]*)$\" {
$name, $value = $matches[1..2]
$ini[$section][$name.Trim()] = $value.Trim()
$ok = $false
}
\"^[^\[].*[^\]]$\" {
if ($ok) {
$value = $matches[0]
$ini[$section][$i] = $value.Trim()
$i++
}
}
default {
$ok = $true
}
}
Return $ini
}[/code:1]
Cette modification m'a permis d'avoir un fichier ini de la forme :
[code:1][Param]
PatternXLS = AORAPM-SOX_Domain Admins*.xls
DossierXLS = C:\30_DT_Admin_Serveurs_windows\03-Suivi\A45-Applications\SOX
ArchiveXLS = C:\30_DT_Admin_Serveurs_windows\03-Suivi\A45-Applications\SOX\Historique
[Groupe]
CN=ITOP-MOSS-Managers,OU=Administrative Groups,OU=IT Operations,DC=xx,DC=xx,DC=xx,DC=xx,DC=xx
[Serveur]
SRV01
SRV02
SRV03[/code:1]
Pour la balise Param même utilisation que Jamel.
Pour groupe et serveur:
[code:1]$ini = Import-Ini $file
$ini.Groupe[0]
$ini.Serveur[1][/code:1]
Le if est là pour des listes de distinguishedName comportant plusieurs signe =.
Si quelqu'un aurait des suggestions d'optimisation, je suis tout ouïe.<br><br>Message édité par: Mephisto, à: 12/03/09 18:37
J'espère que Jamel ne m'en voudra pas de modifier sa fonction.
Je trouve cette fonction vraiment très pratique et très bien conçu.
Par contre j'ai eu d'autre besoin dans mes développements qui ont entrainé de petite modification.
Donc peut-être que d'autre ont eu le même besoin.
[code:1]Function Import-Ini {
param ($file)
$ini = @{}
$ok = $true
switch -regex -file $file
{
\"^\[(.+)\]$\" {
$section = $matches[1]
$ini[$section] = @{}
$i = 0
}
\"^([^=]+)={1}([^=]*)$\" {
$name, $value = $matches[1..2]
$ini[$section][$name.Trim()] = $value.Trim()
$ok = $false
}
\"^[^\[].*[^\]]$\" {
if ($ok) {
$value = $matches[0]
$ini[$section][$i] = $value.Trim()
$i++
}
}
default {
$ok = $true
}
}
Return $ini
}[/code:1]
Cette modification m'a permis d'avoir un fichier ini de la forme :
[code:1][Param]
PatternXLS = AORAPM-SOX_Domain Admins*.xls
DossierXLS = C:\30_DT_Admin_Serveurs_windows\03-Suivi\A45-Applications\SOX
ArchiveXLS = C:\30_DT_Admin_Serveurs_windows\03-Suivi\A45-Applications\SOX\Historique
[Groupe]
CN=ITOP-MOSS-Managers,OU=Administrative Groups,OU=IT Operations,DC=xx,DC=xx,DC=xx,DC=xx,DC=xx
[Serveur]
SRV01
SRV02
SRV03[/code:1]
Pour la balise Param même utilisation que Jamel.
Pour groupe et serveur:
[code:1]$ini = Import-Ini $file
$ini.Groupe[0]
$ini.Serveur[1][/code:1]
Le if est là pour des listes de distinguishedName comportant plusieurs signe =.
Si quelqu'un aurait des suggestions d'optimisation, je suis tout ouïe.<br><br>Message édité par: Mephisto, à: 12/03/09 18:37
Connexion ou Créer un compte pour participer à la conversation.
- maurat
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 1
- Remerciements reçus 0
il y a 15 ans 8 mois #4596
par maurat
Réponse de maurat sur le sujet Re:Importer un fichier INI dans un tableau
Bonjour,
Très bon petit script.
J'ai apporté aussi une petite modif pour prendre en compte les commentaires. Voici le script modifié
[code:1]
Function Import-Ini
{
param ($file)
$ini = @{}
$ok = $true
$commentaire = $false
switch -regex -file $file
{
\"^;.*$\"
{
$commentaire=$true
}
\"^\[(.+)\]$\"
{
$section = $matches[1]
$ini[$section] = @{}
$i = 0
}
\"^([^=]+)={1}([^=]*)$\"
{
if ($commentaire -eq $false)
{
$name, $value = $matches[1..2]
$ini[$section][$name.Trim()] = $value.Trim()
$ok = $false
}
}
\"^[^\[].*[^\]]$\"
{
if ($commentaire -eq $false)
{
if ($ok)
{
$value = $matches[0]
$ini[$section][$i] = $value.Trim()
$i++
}
}
}
default
{
$ok = $true
$commentaire=$false
}
}
Return $ini
}
[/code:1]
Très bon petit script.
J'ai apporté aussi une petite modif pour prendre en compte les commentaires. Voici le script modifié
[code:1]
Function Import-Ini
{
param ($file)
$ini = @{}
$ok = $true
$commentaire = $false
switch -regex -file $file
{
\"^;.*$\"
{
$commentaire=$true
}
\"^\[(.+)\]$\"
{
$section = $matches[1]
$ini[$section] = @{}
$i = 0
}
\"^([^=]+)={1}([^=]*)$\"
{
if ($commentaire -eq $false)
{
$name, $value = $matches[1..2]
$ini[$section][$name.Trim()] = $value.Trim()
$ok = $false
}
}
\"^[^\[].*[^\]]$\"
{
if ($commentaire -eq $false)
{
if ($ok)
{
$value = $matches[0]
$ini[$section][$i] = $value.Trim()
$i++
}
}
}
default
{
$ok = $true
$commentaire=$false
}
}
Return $ini
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.125 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- Importer un fichier INI dans un tableau