Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

Gestion des Fichiers de Configuration en PowerShell

Par Nathan CROSNIER Publié le 28/10/2017 à 23:54:18 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Introduction

Vous est-il déjà arrivé, dans un de vos scripts PowerShell, d’avoir des variables qui peuvent et vont certainement changer en fonction de la personne ou de la machine qui va l’utiliser ? Le tout alors que vous ne voulez pas forcement que les personnes trifouillent dans votre si joli script pour y changer les valeurs à la main, d’autant plus que vous doutez franchement de leur capacité à pouvoir le faire ? De nombreuse variables, des chemins, impossible de le demander à l’utilisateur à chaque exécution de votre script, surtout s’il est destiné à être utiliser de nombreuses fois… Que faire donc ? Et pourquoi ne pas utiliser un fichier de configuration ?! Dans cet article, nous allons voir comment associer un de ces fameux fichiers de configuration (.ini) à notre script PowerShell.

Nous évoquerons deux manières différentes pour lire notre fichier .ini et en récupérer les valeurs, un cas où les valeurs peuvent être en vrac, sans section précise et l’autre, effectivement, avec des sections précises.

Et enfin nous verrons comment utiliser ces valeurs et les passer à nos variables dans notre script, ainsi que la nomenclature des fichiers ini en fonction des deux méthodes, très important donc, sinon vous ne pourrez pas les utiliser.

Variables indépendantes

Je vous préviens tout de suite… j’ai menti ! Je ne vais pas vous montrer deux manières mais plus précisément deux manières et demi de récupérer les valeurs stockées dans un fichier de configuration. Je vais vous montrer deux versions de la façon de traiter le fichier de configuration dans cette partie. J’ai trouvé intéressant de vous montrer l’évolution de celle-ci.

Voici la première version, moins optimisée :

Function Ini
{
    $file = new-Object System.IO.StreamReader( Get-item –Path "MonFichier.ini")
    $Array = @{}
    while($line = $file.ReadLine())
    {
        $pos = $line.IndexOf('=')
        $len = $line.Length
        $id = $line.Substring(1, $pos -1)
        $value = $line.Substring($pos + 1, $len - $pos -2)
        $array.Add($id,$value)
    }
    $file.Close()
    return $array
} 

Comme vous l’aurez certainement remarqué, c’est dans le while, que les deux versions vont se différencier. Décrivons tout ça.

Passons rapidement sur le début. La première ligne, grossièrement, elle permet de récupérer l’ensemble du document et nous permet de travailler sur chaque ligne.

La seconde, initialise un tableau associatif, ou « Hash Table », ce sera dans ce tableau que nous stockerons nos valeurs, fraîchement récupérées.

Rentrons dans le vif du sujet, cette fameuse boucle while, qui bouclera tant qu’il y aura une ligne à lire dans notre fichier.

Les variables $pos et $len, vont respectivement trouver l'emplacement du signe égal (=) dans la ligne et le nombre de caractères dans la ligne, donc sa longueur.

Pour récupérer l'identifiant de la variable, nous allons, dans la ligne, enlever tout ce qui est hors le deuxième caractère (on compte l'index en partant de 0, n'oublions pas) et le caractère avant le égal. Et pour la valeur, nous supprimons tout ce qui n'est pas compris entre le caractère après le égal et la différence entre la longueur totale de la ligne et la position, plus 2, du égal, soit l'avant dernier caractère... et ça pour chaque ligne.

Ouah... vous voyer maintenant pourquoi il y a eu une V2 de cette façon ci.

Ensuite très simple, on remplit notre tableau associatif avec la variable $id pour identifiant et $value pour valeur. Après ça, la lecture du fichier se termine et la fonction nous retourne le tableaux.

Bon, passons à notre seconde version et nous nous intéresserons directement à la boucle while :

Function Ini
{
    $file = new-Object System.IO.StreamReader( Get-item –Path "MonFichier.ini")
    $Array = @{}
    while($line = $file.ReadLine())
    {
        $splitLine = $line.Split('=')
        $id = $splitLine[0].Replace("[","") 
        $value = $splitLine[1].Replace("]","")
        $array.Add($id,$value)
    }
    $file.Close()
    return $array
} 

C'est déjà plus lisible !

Il y a donc le même fonctionnement ici, on trouve le symbole "=", puis séparer l'identifiant de la la valeur pour les mettre dans un tableau, sauf qu'ici, c'est plus simple.

La méthode Split va scinder notre string à chaque fois que l'on rencontre le caractère ou la chaine de caractères qu'on va lui passer, ici forcément, ce sera notre bon vieux signe égal.

Ensuite pour l'identifiant nous n'auront plus qu'à, dans la partie avant la rencontre du = , supprimer le crochet ouvrant.

Enfin, pour la valeur, il faut supprimer le crochet fermant dans la partie « post égal ». Pour être plus précis, la méthode que l'on utilise pour supprimer les crochet, la méthode Replace, va prendre deux paramètres, et va remplacer la chaine de caractère que nous préciserons dans le premier paramètre par celle du second paramètre. Dans notre cas, nous remplacons les symboles "[" et "]" par... rien. Ce qui a pour but de les supprimer.

Variables dans des sections

Dans cette seconde partie, nous allons parler de notre seconde (vraie) manière pour récupérer les valeurs de notre fichier ini.

Voyons tout d'abord à quoi ressemble cette fonction, pour que nous puissions la passer en revue :

Function Ini ($file)
{
    $ini = @{}
    switch -regex -file $file
    {
        "^\[(.+)\]$"{
            $section = $matches[1]
            $ini[$section] = @{}}
        "(.+)=(.*)"{
            $name, $value = $matches[1..2]
            $ini[$section][$name] = $value
        }
    }
    return $ini
} 

Comme dit dans le titre de cette section, notre fichier de configuration va être trier par... sections, organiser par partie que vous préciserez dans votre fichier ini de votre coté (je vous montrerai comment faire dans la dernière grande partie de cet article, pas de panique).

Donc ! Comme pour l'autre, ce sera dans un tableau associatif que seront stockées toutes nos valeurs. Suivant ça, la fonction gère deux cas de figure, grâce à de -astucieuses- expressions régulières.

Premier cas, la ligne commence avec un crochet ouvrant, comporte au moins un caractère à l’intérieur et se termine par un crochet fermant, facile, cela sera une section, nous créons donc dans notre tableau $ini un... tableau, oui.

Dans le second cas, il faut qu'il y ai le symbole égal, précédé par au moins un caractère. Si la chaine "match" avec ça, créer dans le tableau $ini, dans le tableau qui porte le nom de la section, qui vient d'être créé, un nouvel identifiant, comportant le name de la variable qui lui même comportera sa valeur.

Et enfin le tableau est retourné des que tout le fichier est traité.

Bon je vous l'ai promis et c'est plutôt essentiel donc, nous allons voir comment gérer tout ce qui vient d'être fait.

Application

Dans cette dernière partie, nous allons nous intéresser à la nomenclatures des fichiers de configurations nécessaire pour que nos deux fonctions puissent les lire et voir comment utiliser touts ce que nous aurons récupéré.

Variables indépendantes

Dans cette partie nous allons voir à quoi le fichier de configuration doit ressembler pour que nous puissions utiliser notre fonction Ini de notre première partie.

Voici la syntaxe :

[FirstName=Bruce]
[LastName=Wayne] 
[UserName=Batman]

Donc le chaque ligne du fichier doivent débutées et finir par un crochet, le nom de la variable et sa valeur doivent être séparés par un égal, aucune guillemet, parenthèse ou quoi que ce soit d'autre. Cette technique à également un soucis de taille... nous ne pouvons pas commenter notre fichier ini, effectivement, chaque ligne doit comporter une valeur à traiter dans le même cadre que les notre. La fonction associée ne gère pas les autres cas que celui de l'identifiant-valeur. Passons à l'autre manière de faire qui, elle va peut être nous aider pour ce dernier soucis.

Variables dans des sections

Bon je ne vais pas vous faire tourner autour du pot... dans ce cas là, nous allons pouvoir mettre des commentaires dans notre fichier de configuration, génial non ?

Sans plus attendre, voici comment va se profiler notre fichier .ini :

#Les noms de notre personnage
[Names]
FirstName=Bruce
LastName=Wayne
UserName=Batman

#Ses statistiques
[Statistics]
Strength=99
Skills=99
Intelligence=99
Darkness=99

Et bien ! Qu'il est fort notre Batou. Trêve de plaisanterie, le format à changer par rapport à notre précédent template de fichier de configuration. Ici nous allons pouvoir trier notre variables, par thèmes, et tout ce qui ne commence et ne se termine pas par des crochets ou qui ne comporte pas de "=", peut être utilisé comme commentaire, permettant du coup une meilleur visibilité à votre fichier pour les personnes autre que vous.

Utilisation des tableaux

Partie très courte ici, pour pouvoir utiliser les valeur que nous avons récupérés, il suffit de procéder de la sorte, en prenant l'exemple de tout à l'heure, les tableaux ayant pour noms $ini

Pour la première méthode :

$ini.UserName
Batman

Pour la seconde :

$ini.Names.UserName
Batman

Tout simple non ? Et ça pour toutes les valeurs que vous voudrez utiliser.

Conclusion

Nous avons donc vu deux façons différentes pour récupérer les valeurs stockées dans notre fichier .ini, avec et sans la posibilité d'y implémenter des commentaires ou de les trier par catégories.

En espérant vous avoir été utile sur le sujet, je vous remercie d'avoir lu cette article.

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels