A PSD1 fájl a PowerShell Data File formátumot jelenti. Ez gyakorlatilag egy speciális szkript fájl, amiben egy hashtábla definíciót tárolunk. Nézzünk erre az előzőkhez hasonló adattartalommal rendelkező példát:
@{
# This is a comment row
SQLServerData = @{
ServerName = "WS2019SQL"
IP = "192.168.1.1"
}
<#
this is a multi line
comment
#>
DBData = @{
Database
= "MigrationData"
Table = "Users"
Columns = ("Name", "Samaccountname", "Department")
Orgs = ("Marketing", "Sales", "Manfacturing",
"Finance", "Engineering")
}
AdditionalData = @{
Number = 123
Date = {[datetime] "2022.12.19"}
Answer = $true
}
}
Látható, hogy egy kukac-kapcsos zárójel kombinációval kezdődik, mint ahogy a hashtáblák jelölése van PowerShell-ben. Ezen belül lehet újabb hashtáblákat létrehozni, tehát tetszőleges mélységben szervezhetjük adatainkat. Természetesen megjegyzéseket is berakhatunk, akár többsorosakat is.
Ha már PowerShell, akkor itt megpróbálok érdekesebb dolgokat is elrejteni! Az AdditionalData részbe beraktam egy Date adatot, ami egy szkriptblokk és az Answer pedig egy változó.
Elég egyszerű ezt beolvasni:
PS C:\> $PSConfigPSD1 = Import-PowerShellDataFile -Path C:\PSTools\Config.PSD1
PS C:\> $PSConfigPSD1
Name Value
---- -----
DBData {Table, Database, Columns, Orgs}
SQLServerData {IP, ServerName}
AdditionalData {Date, Number, Answer}
PS C:\> $PSConfigPSD1.AdditionalData
Name Value
---- -----
Date {[datetime] "2022.12.19"}
Number 123
Answer True
PS C:\> $PSConfigPSD1.DBData.Orgs
Marketing
Sales
Manfacturing
Finance
Engineering
A beolvasáshoz közvetlenül az Import-PowerShellDataFile cmdletet használhatjuk. Ez ellenőrzi a fájl tartalmát és végrehajtható kódot nem enged beolvasni, tehát véletlenül nem tudunk vele kártékony kódot futtatni. A példaállományomban a Date értéke is adat, hiszen a PowerShellben a szkriptblokk is egy adattípus:
PS C:\> $PSConfigPSD1.AdditionalData.Date.gettype().fullname
System.Management.Automation.ScriptBlock
Tehát ez az Import-PowerShellDataFile cmdlet nem egyszerűen beolvassa a fájlt, hanem bizonyos adatkonverziókat is elvégez. Nézzük meg részletesebben az Answer-t:
PS C:\> $PSConfigPSD1.AdditionalData.Answer
True
PS C:\> $PSConfigPSD1.AdditionalData.Answer.gettype().fullname
System.Boolean
Látható, hogy a változót is feloldotta, így nem egy egyszerű szövegként értelmezte, hanem tényleg a változó értéke került be, a mi esetünkben egy Boolean adattípusú True.
Térjünk vissza a Date-hez! Ha nem szkiptblokkba ágyaztuk volna, akkor a biztonsági ellenőrzés miatt hibát kapnánk:
PS C:\> $PSConfigPSD1 = Import-PowerShellDataFile -Path C:\PSTools\Config.PSD1
Exception calling "SafeGetValue" with "0" argument(s): "Cannot generate a Wind
ows PowerShell object for a ScriptBlock evaluating dynamic expressions. Dynami
c expression: @{
# This is a comment row
SQLServerData = @{
…
Térjünk vissza az eredeti Date-hez! Próbáljuk a végrehajtó operátorral végrehajtani azt a szkriptblokkot:
PS C:\> & $PSConfigPSD1.AdditionalData.Date
[datetime] "2022.12.19"
Hoppá! Annak ellenére, hogy ez egy szkriptblokk, mégsem hajtódott végre. Mi lett ebből akkor?
PS C:\> (& $PSConfigPSD1.AdditionalData.Date).gettype().fullname
System.Management.Automation.ScriptBlock
Ez valahogy továbbra is szkriptblokk… Akkor próbáljuk még egyszer végrehajtani a végrehajtást!
PS C:\> &(& $PSConfigPSD1.AdditionalData.Date)
2022. december 19., hétfő 0:00:00
Na, így már jó lett. Nem teljesen értem, hogy miért kell kétszer végrehajtani, szerintem ez az Import-PowerShellDataFile hibája, de azért ez nem akkora kellemetlenség. Természetesen nem érdemes kritikátlanul végrehajtani az így beolvasott szkriptblokkokat, érdemes „beleolvasni” ezekbe és csak akkor végrehajtani, ha nincs bennük semmilyen kártékony kód.