Nagyon hatékony programozási lehetőség, hogy mind a tulajdonságokat, mind a metódusokat nem csak statikus módon, hanem futásidőben kiértékelődő kifejezés alapján is elérhetjük. Ez így elég bonyolultnak tűnhet, így inkább nézzük meg mindezt néhány egyszerű példán:
function Szilveszteri-buli {
param(
[validateset("Napok", "Órák", "Percek", "Másodpercek")]
$mértékegység = "Napok"
)
$dict = @{
Napok = "Days"
Órák = "Hours"
Percek = "Minutes"
Másodpercek = "Seconds"
}
$timespan = (Get-Date -Month 12 -Day 31 -Hour 20 -Minute 0 -Second 0) - (get-date)
$timespan."Total$($dict.$mértékegység)"
}
A fenti függvény megadja, hogy mennyi idő van az aktuális év szilveszteri bulijáig, feltételezve, hogy az szilveszter napján este 8 órakor kezdődik. A függvény paramétereként meg lehet adni, hogy milyen mértékegységben kérjük ezt az értéket: napokba, órákban, percekben vagy másodpercekben. A függvény törzsében a kért mértékegységet át kell fordítanunk angolra, majd a leendő buli időpontja és a mostani időpont különbségét képzem, majd ennek veszem a „TotalDays”, „TotalHours”, „TotalMinutes” vagy „TotalSeconds” tulajdonságát.
Itt, a függvény utolsó sorában az időkülönbség (timespan) különböző tulajdonságait egy futás időben létrejövő szöveges adattal képzem ("Total$($dict.$mértékegység)"). A Total előtag mellé a $dict szótár $mértékegység angol megfelelőjét biggyesztem hozzá. Azaz megspóroltam egy csomó IF/ELSEIF feltétel végrehajtását (ha a mértékegység Napok, akkor vegyük a TotalDays tulajdonságot, egyébként ha a mértékegység Órák, akkor vegyük a TotalHours tulajdonságot, stb.)
Ha ezt futtatjuk, akkor ilyen eredményeket kapunk:
PS C:\> Szilveszteri-buli -mértékegység Napok
88,8506018518518
PS C:\> Szilveszteri-buli -mértékegység Órák
2132,41361083308
PS C:\> Szilveszteri-buli -mértékegység Másodpercek
7676687
PowerShell 4.0-óta ugyanezt tehetjük a metódusok hívásánál is. Nézzünk a szövegek átalakítására egy egyszerű függvényt:
function Szövegalakítás {
param(
[string] $szöveg,
[ValidateSet("Kisbetűs", "Nagybetűs", "Tördelt", "Betűkre")]
$formátum = "Nagybetűs"
)
$dict = @{
Kisbetűs = "ToLower"
Nagybetűs = "ToUpper"
Tördelt = "Split"
Betűkre = "ToCharArray"
}
$szöveg.($dict.$formátum)()
}
Itt is hasonló a logika, mint az előző példafüggvénynél. A szöveget különböző módokon lehet átalakítani, ezt a $formátum paraméterrel adom meg. Ezt a $dict szótárral a megfelelő metódusnévre alakítom, majd a $szöveg megfelelő metódusát ez alapján dinamikusan hívom meg.
PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Kisbetűs
powershell 5.0
PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Nagybetűs
POWERSHELL 5.0
PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Tördelt
PowerShell
5.0
PS C:\> Szövegalakítás -szöveg "PowerShell 5.0" -formátum Betűkre
P
o
w
e
r
S
h
e
l
l
5
.
0
Megjegyzés
A metódusok gömbölyű zárójelpárja nem tartozhat bele a futásidőben létrejövő kifejezésbe, az mindenképpen statikus kell legyen, mint ahogy a fenti példában ($szöveg.($dict.$formátum)()) a zárójelpár nem a szótárból jön, hanem oda van írva a sor végére.
Ezekkel a dinamikus lehetőségekkel nagyon tömör és hatékony szkripteket, függvényeket készíthetünk, bár a kód olvasása, értelmezése esetleg kicsit nagyobb kihívást jelenthet mások számára.