PowerShell - Fonction - Exporter ces variables

Comment je peux récupérer des variables dans un autre contexte ?


Mise en situation

Je travaille actuellement sur une application qui fonctionne dans deux environnements différents, le système d’exploitation Windows 10 et un environnement de préinstallation Windows (Windows PE ou Winpe). J’ai eu besoin de récupérer des variables d’un environnement à un autre. Nous n’utilisons pas d’autres outils tiers comme MDT ou IVANTI.

Solution

Mettre en place plusieurs modules qui permettent de générer un fichier XML puis un autre module pour lire le document XML que j’aurais récupéré pour m’ajouter mes variables dans mon script déjà existant.

Etape 1 : Générer le fichier XML

Dans mon cas, j'ai eu besoin de générer un fichier XML avec un Template précis, donc j'ai créer ce module:
La fonction New-VariableXmlFile

Function New-VariableXmlFile{
param(
            [Parameter (Mandatory)]
            [System.IO.FileInfo]$Path
        )
     # Create the XML File Tags
     $xmlWriter = New-Object System.XMl.XmlTextWriter($Path,$Null)
     $xmlWriter.Formatting = 'Indented'
     $xmlWriter.Indentation = 1
     $XmlWriter.IndentChar = "`t"
     $xmlWriter.WriteStartDocument()
     $xmlWriter.WriteComment('This xml file is used with Add-VariableOnXml and Add-VariableFromXml')
     $xmlWriter.WriteStartElement('VariableList')
     $xmlWriter.WriteStartElement('Variable')
     $xmlWriter.WriteEndElement()
     $xmlWriter.WriteEndElement()
     $xmlWriter.WriteEndDocument()
     $xmlWriter.Flush()
     $xmlWriter.Close()

}
Usage :
Une fois que vous aurez rajouter cette fonction dans votre script pour l'appeler la commande suivante : New-VariableXmlFile -Path C:\Demo\Variable
Résultat :
On va obtenir un fichier XML dans le dossier C:\Demo\Variable
<?xml version="1.0"?>
<!--This xml file is used with Add-VariableOnXml and Add-VariableFromXml-->
<VariableList>
  <Variable />
</VariableList>

Etape 2 : Rajouter des variables dans le fichier XML

Maintenant que ce fichier a été créé, nous allons rajouter nos variables avec le Nom et sa valeur via cette fonction.
La fonction Add-VariableOnXml

Function Add-VariableOnXml
{
    param(
            [Parameter (Mandatory)]
            [ValidateScript({
                if(-Not ($_ | Test-Path) ){
                    throw "File or folder does not exist"
                }
                if(-Not ($_ | Test-Path -PathType Leaf) ){
                    throw "The Path argument must be a file. Folder paths are not allowed."
                }
                if($_ -notmatch "(\.xml)"){
                    throw "The file specified in the path argument must be either of type xml"
                }
                return $true 
            })]
            [System.IO.FileInfo]$Path,
            [Parameter (Mandatory)]
            [ValidateNotNullOrEmpty()]
            [String]$Name,
            [Parameter (Mandatory)]
            [ValidateNotNullOrEmpty()]
            [String]$Value
        )
    $Xml = [System.Xml.XmlDocument](Get-Content $Path)
    If ($Xml.'#comment' -cne 'This xml file is used with Add-VariableOnXml and Add-VariableFromXml'){ throw "This Xml file can not be use"}
    Else {
    if ($Xml.VariableList.Variable.FirstChild -eq $null)
    {
    $AddName = $Xml.CreateElement("Name")
    $AddValueName = $Xml.CreateTextNode($Name)
    $xml.SelectSingleNode("//Variable").AppendChild($AddName) | Out-Null
    $xml.VariableList.Variable.LastChild.AppendChild($AddValueName) | Out-Null
    $AddValue = $Xml.CreateElement("Value")
    $AddValueValue = $Xml.CreateTextNode($Value)
    $xml.SelectSingleNode("//Variable").AppendChild($AddValue) | Out-Null
    $xml.VariableList.Variable.LastChild.AppendChild($AddValueValue) | Out-Null
    }
    else
    {
    try {
    $element = $Xml.VariableList.Variable[0].Clone()
    }
    catch {
    $element = $Xml.VariableList.Variable.Clone()
    }
    $element.Name = $Name
    $element.Value = $Value
    $Xml.DocumentElement.AppendChild($element)
    }
    
    $Xml.Save($Path)
    }
}
Après avoir lancer la commande Add-VariableOnXml -Path C:\Demo\Variable.xml -Name Demo -Value "C:\Demo", nous nous retrouvons avec ce fichier Variable.xml
<?xml version="1.0"?>
<!--This xml file is used with Add-VariableOnXml and Add-VariableFromXml-->
<VariableList>
  <Variable />
</VariableList>

Etape 3 : Rajouter des variables depuis le fichier XML

Maintenant que ce fichier a été créé et que nos variables ont été rajouter dans notre fichier, on va devoir l'exporter dans l'autre environnement, je vous laisse trouver une solution. Dans le script qui aura besoin de récupérer ces variables, nous allons utiliser la fonction Add-VariableFromXml.
La fonction Add-VariableFromXml

Function Add-VariableFromXml
{
    param(
            [Parameter (Mandatory)]
            [ValidateScript({
                if(-Not ($_ | Test-Path) ){
                    throw "File or folder does not exist"
                }
                if(-Not ($_ | Test-Path -PathType Leaf) ){
                    throw "The Path argument must be a file. Folder paths are not allowed."
                }
                if($_ -notmatch "(\.xml)"){
                    throw "The file specified in the path argument must be either of type xml"
                }
                return $true 
            })]
            [System.IO.FileInfo]$Path
        )
    $Xml = [xml](Get-Content $Path)
    If ($Xml.'#comment' -cne 'This xml file is used with Add-VariableOnXml and Add-VariableFromXml'){ throw "This Xml file can not be use"}
    Else {
    $Before = Get-Variable -Exclude $,^,? | Select-Object Name,Value
    $Xml.VariableList.Variable| ForEach-Object {
    New-Variable -Name $_.Name -Value $_.Value -Force -Scope Script
    }
    $Now = Get-Variable -Exclude $,^,?,Before | Select-Object Name,Value
        For ($i = 0; $i -lt $Now.Count; $i++)
    {
        if ($Now[$i].Name -eq "$")
        {
            $p.RemoveAt($i)
            $i--
        }
        elseif ($Now[$i].Name -eq "^")
                {
            $p.RemoveAt($i)
            $i--
        }   
    }
    
    $NewValue = Compare-Object -DifferenceObject $Now -ReferenceObject $Before -Property Name,Value | sort Name | Select-Object Name,Value
    Return $NewValue
    }
}
Usage :
Une fois que vous aurez rajouter cette fonction dans votre script pour l'appeler la commande suivante : Add-VariableFromXml -Path 'C:\Demo\Variable.xml'
Résultat :
Name                           Value                                                                                                                                                                      
----                           -----                                                                                                                                                                      
Demo                           Thisisashit                                                                                                                                                                

On va obtenir la variable dans le contexte du script.

À vos scripts, prêts, c'est parti.

Commentaires

Posts les plus consultés de ce blog

PowerShell - Utiliser NSIS (Nullsoft Scriptable Install System) pour simplifier l'usage des scripts PS1

PowerShell - Mes aide-mémoires