PSD1 adatfájlok dinamikus adatainak feloldása

Tehát láttuk, hogy a PSD1 fájlban található kifejtendő adatokat nekünk kel kifejtenünk. Készítsünk erre egy függvényt, ami egy példa szkriptben van. Íme a példaszkript:

# This is a production script

 

#region Functions

function ParseConfig {

param(

    $path = "$($PSScriptFullPath).psd1"

)

    function ResolveDynamicData {

    param([hashtable] $confighive)

       

        foreach($key in $confighive.Clone().Keys){

            if($confighive.$key -is [hashtable]){

                ResolveDynamicData -confighive $confighive.$key

            }

            elseif($confighive.$key -is [scriptblock]){

                $confighive.$key = &(& $confighive.$key)

            }

        }

    }

 

    $PSConfig = Import-PowerShellDataFile -Path $path

 

    ResolveDynamicData -confighive $PSConfig

 

    $PSConfig

}

#endregion

 

#########################################################

#

# Body

#

#########################################################

 

$PSScriptFullPath = $myinvocation.mycommand.path

$PSScriptMyRoot   = $PSScriptRoot

$PSConfig = ParseConfig 

A ParseConfig függvény paramétere a PSD1 fájl elérési útja. Az alaphelyzetben majd a szkript elérési útja megtoldva a .PSD1 kiterjesztéssel lesz. A függvényen belül egy másik függvényt csináltam ResolveDynamicData névvel azért, hogy rekurzívan meg tudjam hívni és így be tudjam járni a PSD1 fájl mélységeit is. Ez a függvény egy hashtáblát vár paraméterként, majd az ágain végighalad és ha az ág is hashtábla, akkor meghívja saját magát az ágat adva át bemeneti paraméterként, ha pedig az ág egy szkriptblokk, akkor azt duplán végrehajtja és visszatölti a szkriptblokk helyére, ahogy azt az előbb láttuk. Egyéb esetekben nem nyúl az ágakhoz.

Valójában a foreach ciklusban az eredeti $confighive klónjának a kulcsain megyek végig. Erre azért van szükség, mert a foreach ciklus nem szereti, ha menet közben megváltoztatjuk annak a hashtáblának a tartalmát, amit éppen bejárunk. Márpedig itt újra definiáljuk a szkriptblokkokat tartozó elemeket.

A ParseConfig többi részében importálom a PSD1 fájl, meghívom a korábban ismertetett ResolveDynamicData rekurzív függvényt, majd kirakom a kimenetre a $PSConfig hashtáblát.

Nézzünk egy PSD1 fájlt, ami már imitálja, hogy milyen fajta információk lehetnek egy ilyen konfigurációs fájlban:

@{

    # This section is used by this specific script

    ScriptConfig = @{

        textvalue = "SomeText"

        date = {[datetime] "2022.12.01"}

        bool = $true

    }

 

    # This should be shared between other scripts

    AccessToRESTApi = @{

        AppID = 'd24099e5-10cb-4388-8ef4-f1c9f374d50b'

        Token = 'UG93ZXJTaGVsbElzR3JlYXQh'

        ApiURL = 'https://api.myapp.com/rest'

    }

 

    # This is a default setting for all scripts

    LogSettings = @{

        LogFolder = {join-path $PSScriptMyRoot Logs}

        subhive = @{

            subdynamicdata = {[math]::Sqrt(9)}

        }

    }

}

Futtassuk a fő szkriptet, és nézzük meg mi lesz a $PSConfig változóban:

PS C:\> . C:\PSTools\Section05-Video2Script.ps1

PS C:\> $PSConfig

 

Name                           Value

----                           -----

AccessToRESTApi                {AppID, Token, ApiURL}

LogSettings                    {subhive, LogFolder}

ScriptConfig                   {date, textvalue, bool}

Láthatjuk, hogy a date adat jól ki lett fejtve:

PS C:\> $PSConfig.ScriptConfig

 

Name                           Value

----                           -----

date                           2022. 12. 01. 0:00:00

textvalue                      SomeText

bool                           True

A LogFolder értéke is:

PS C:\> $PSConfig.LogSettings

 

Name                           Value

----                           -----

subhive                        {subdynamicdata}

LogFolder                      C:\PSTools\Logs

Még a subdynamicdata is a mélyebb rétegben, működött a rekurzió:

PS C:\> $PSConfig.LogSettings.subhive

 

Name                           Value

----                           -----

subdynamicdata                 3



Word To HTML Converter