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