L’intérêt du XML pour vos scripts
12-03-2020 – Edit : L’article date un peu et d’autres types de fichiers sont peut être plus pertinent que le XML, le JSON par exemple.
Par ailleurs, ce dernier vous permettra d’utiliser des apis, voici la documentation de Microsoft à ce sujet. Je rédigerai un article à ce sujet dans les prochaines semaines.
On va partir du postulat que vous avez complètement abandonné les scripts bat, cmd et vbs afin d’utiliser la puissance de Powershell ! (sur vos environnements Microsoft bien sûr)
Le contexte
Dans notre cas, certains scripts devenaient complexes et contenaient des « données » donc à chaque ajout ou modification d’une donnée, il fallait directement faire de la saisie au sein même du script.
En soit, rien d’insurmontable, mais ce n’est pas super propre et il fallait faire très attention à ne pas faire d’erreur au risque de rendre inopérant un script s’exécutant plusieurs dizaines ou centaines de fois par jour. De plus, certaines données sont utiles pour plusieurs scripts et doivent être maintenues à jour simultanément ce qui demande une certaine rigueur et peut être source d’erreur.
Mon super technicien (ancien développeur) m’a soumis l’idée de séparer les traitements (scripts) des données et m’a soufflé « XML ». L’idée a fait son chemin et aujourd’hui nous travaillons sur l’amélioration globale de nos scripts.
XML en quelques mots
XML (eXtensible Markup Language) est un langage de balisage, il peut servir à deux choses :
- Créer des documents (XHTML par exemple)
- Stocker des données structurées
Ce langage est souvent utilisé dans un but d’interopérabilité entre systèmes d’information hétérogènes.
Pour plus d’information, je vous invite à consulter l’article Wikipédia très complet à ce sujet :
http://fr.wikipedia.org/wiki/Extensible_Markup_Language
Dans notre cas, utiliser xml permet de ne plus modifier des scripts parfois complexes au risque de les rendre dysfonctionnels.
Il est également possible de faire modifier facilement votre configuration par un collaborateur ne possédant pas de compétence en PowerShell.
Enfin, s’agissant de fichiers textes structurés, il est possible de créer des interfaces graphiques permettant l’affichage, l’ajout et la modification de données et de paramètres.
Mise en pratique
Construire mon fichier XML
Pour cet exemple on va utiliser le mappage des lecteurs réseau en environnement Microsoft.
Les informations nécessaires pour mapper un lecteur réseau sont :
- Le nom de votre lecteur (name)
- La lettre du lecteur (letter)
- Le chemin d’accès au serveur de fichier (path)
- le groupe de sécurité associé à votre lecteur (il est possible, si votre script est correctement développé d’utiliser un ensemble de groupes, nous verrons ça par la suite) (group)
Il est possible de passer d’autres paramètres, ceux-ci sont suffisants pour notre exemple.
Voici maintenant un exemple de structure pour votre fichier :
<drives> <drive> <name>Disque Comptabilite</name> <path>\\SRV-FICHIERS\Disques\COMPTA</path> <letter>H</letter> <group>GG_COMPTA_*</group> </drive> <drive> <name>Disque Direction</name> <path>\\SRV-FICHIERS\Disques\DIRECTION</path> <letter>J</letter> <group>GG_DIRECTION_*</group> </drive> </drives>
Exemple simple XML pour disques réseau
On se rend rapidement compte de la facilité de création d’un tel fichier et de sa lisibilité.
Un fichier XML devrait normalement contenir un entête avec une balise <doctype>, nous n’en avons pas spécialement besoin pour nos scripts.
Il existe des logiciels d’édition de fichiers XML, je n’en utilise pas, un bon éditeur de texte (notepad++ par exemple) est, je pense, suffisant pour notre usage.
Où placer mon fichier XML ?
Il est important de placer votre fichier XML à un endroit accessible à l’ensemble des scripts qui l’utilisent. Dans le cadre de scripts Active Directory, un répertoire dans le SYSVOL peut être une solution.
Pour plus d’information pour le SYSVOL, voici une documentation Microsoft :
http://support.microsoft.com/kb/324175/fr
Si vous souhaitez placer votre fichier XML dans le même répertoire et détecter dynamiquement l’emplacement de ce dernier, voici un bout de code PowerShell permettant de faire cela.
function Get-ScriptDirectory { $Invocation = (Get-Variable MyInvocation -Scope 1).Value Split-Path $Invocation.MyCommand.Path } $path = Get-ScriptDirectory
Fonction détection du chemin d’exécution
Je ne vous présenterai pas l’utilisation de ce bout de code par la suite, mais il pourrait vous être très utile pour vos mises en oeuvre.
Comment lire mon fichier XML ?
Vous savez créer votre fichier, aller le chercher, il faut le lire maintenant !
Vous qui êtes fan de PowerShell, vous savez que tout y est objet. Pour la lecture de votre XML c’est pareil!
Si l’on reprend notre exemple de disque réseau, vous aurez un objet « drives » qui contiendra tous vos objets « drive » qui eux même auront des objets « name », « path », « letter » et « group ». Allez, on se lance!
Je vous invite à créer votre script « test.ps1 » et votre fichier xml « testXML.xml » dans le répertoire C:\TEMP dans votre pc. Le fichier XML contiendra l’exemple vu auparavant.
Voici maintenant votre script de lecture du fichier XML.
#On récupère le fichier XML dans le TEMP $path = "C:\TEMP" [xml]$xmlfile=Get-Content $path\testXML.xml #On boucle sur chaque lecteur présent en XML foreach($drive in $xmlfile.drives.drive){ $name=$drive.name $letter=$drive.letter $path=$drive.path $group=$drive.group Write-Host "Le disque $name sera mappé avec la lettre $letter, le groupe de sécurité lié est $group et le chemin est $path" }
Fichier powershell lisant du XML
Le résultat sera l’affichage des lignes suivantes :
Le disque Disque Comptabilite sera mappé avec la lettre H, le groupe de sécurité lié est GG_COMPTA_* et le chemin est \\SRV-FICHIERS\Disques\COMPTA
Le disque Disque Direction sera mappé avec la lettre J, le groupe de sécurité lié est GG_DIRECTION_* et le chemin est \\SRV-FICHIERS\Disques\DIRECTION
Décortiquons tout ça :
Déclarez en variable le chemin où se situe votre script, vous pouvez également utiliser la fonction de recherche du chemin d’exécution décrit auparavant pour définir $path, ici on définit C:\TEMP .
$path = "C:\TEMP"
On crée une variable $xmlfile, on spécifie qu’il s’agit d’une variable de type xml par le biais de [xml] placé devant le nom de votre variable. On alimente cette variable avec le contenu de votre fichier xml grâce à la commande Get-Content suivie du chemin complet de votre fichier xml.
[xml]$xmlfile=Get-Content $path\testXML.xml
Maintenant il va falloir parcourir le fichier par le biais d’une boucle foreach(), on boucle sur les objets drive contenu dans l’objet drives présent dans votre fichier xml $xmlfile, chaque objet drive sera instancié dans la variable $drive exploitable dans la boucle uniquement. ($drive in $xmlfile.drives.drive)
foreach($drive in $xmlfile.drives.drive){
Dans la boucle, on récupère sous la forme de variable les différents paramètres de notre objet $drive. Par exemple, on récupère le nom de notre disque réseau $drive.name dans la variable $name et ainsi de suite pour les autres paramètres.
$name=$drive.name $letter=$drive.letter $path=$drive.path $group=$drive.group
On écrit avec la commande Write-Host ce que l’on souhaite entre guillemets afin de définir l’ensemble comme une chaîne de caractère. Il n’est alors pas nécessaire de concaténer pour afficher les variables. Il suffit de les intégrer directement dans la chaîne de caractère. On n’oublie pas de fermer la boucle }.
Write-Host "Le disque $name sera mappé avec la lettre $letter, le groupe de sécurité lié est $group et le chemin est $path" }
Je suis passé par l’utilisation de variable pour récupérer les valeurs de mes objets drive. Il est possible de les consulter directement, mais j’ai rencontré des soucis dans des scripts plus avancés.
Attention à l’encodage !
Si vous utilisez des caractères spéciaux (des accents par exemple) dans votre fichier XML, il est fort probable que vous rencontriez des soucis à l’affichage. En effet, la plupart des éditeurs textes encodent en UTF-8. Powershell ISE (votre outil de création de scripts) encode vos fichiers en UTF-16BE…
Il suffit de réencoder vos fichiers XMLen UTF-16BE, avec notepad++ par exemple pour ne plus avoir de problèmes de cet ordre.
Voilà ! Vous savez utiliser XML pour vos scripts, dans de prochains articles il y aura des exemples complets et concrets de ce type d’utilisation.
Commentaires