Question Importer un fichier INI dans un tableau

Plus d'informations
il y a 17 ans 5 mois #712 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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 5 mois #715 par Robin Lemesle
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

Robin MVP PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 5 mois #719 par Jacques Barathon
Aucun problème.

Janel

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 5 mois #720 par Arnaud Petitjean
C'est un excellent script !

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.

Plus d'informations
il y a 15 ans 10 mois #4196 par Bredin Samuel
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
{
\&quot;^\[(.+)\]$\&quot; {
$section = $matches[1]
$ini[$section] = @{}
$i = 0
}
\&quot;^([^=]+)={1}([^=]*)$\&quot; {
$name, $value = $matches[1..2]
$ini[$section][$name.Trim()] = $value.Trim()
$ok = $false
}
\&quot;^[^\[].*[^\]]$\&quot; {
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.

Plus d'informations
il y a 15 ans 8 mois #4596 par maurat
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
{
\&quot;^;.*$\&quot;
{
$commentaire=$true
}
\&quot;^\[(.+)\]$\&quot;
{
$section = $matches[1]
$ini[$section] = @{}
$i = 0
}
\&quot;^([^=]+)={1}([^=]*)$\&quot;
{
if ($commentaire -eq $false)
{
$name, $value = $matches[1..2]
$ini[$section][$name.Trim()] = $value.Trim()
$ok = $false
}
}
\&quot;^[^\[].*[^\]]$\&quot;
{
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
Propulsé par Kunena