Beszéltünk az álnevekről, cmdletekről, függvényekről, szkriptekről. Láttuk azt is, hogy a PowerShell ugyanúgy végrehajtja az elérési úton található futtatható állományokat, mint ahogy a hagyományos parancssor.
Azt is láttuk, hogy elnevezések tekintetében elég szabad a PowerShell, nagyon kevés megszorítás van a neveket illetően, így például lehet egyforma neve egy általunk létrehozott függvénynek és aliasnak, mint egy meglevő cmdletnek. Például elnevezhetek egy függvény így is:
[14] PS C:\old> function script.ps1 {"Ez most függvény"}
[15] PS C:\old> script.ps1
Ez most függvény
Annak ellenére is, hogy ugyanilyen névvel van nekem egy szkriptem is, ráadásul éppen az aktuális könyvtárban:
[16] PS C:\old> Get-Content script.ps1
"Ez most a szkript"
Ennek ellenére a [15]-ös sorban a „script.ps1” beírására nem a szkriptem, hanem a függvényem futott le. És ez még nem elég, ugyanilyen névvel létrehozhatok egy álnevet is:
[17] PS C:\old> New-Alias script.ps1 get-command
Ha most futtatom a „script.ps1”-et, akkor az alias fut le:
[18] PS C:\old> script.ps1
CommandType Name Definition
----------- ---- ----------
Cmdlet Add-Content Add-Content [-Path] <Strin...
Cmdlet Add-History Add-History [[-InputObject...
Cmdlet Add-Member Add-Member [-MemberType] <...
Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <Stri...
Cmdlet Clear-Content Clear-Content [-Path] <Str...
...
Hogyan lehet mégis a szkriptet lefuttatni? Hát például így:
[19] PS C:\old> &(get-item script.ps1)
Ez most a szkript
Hogyan tudom a függvényt futtatni? Hasonló logikával, mint a szkriptet, csak más a tárolásának helye:
[20] PS C:\old> &(get-item function:script.ps1)
Ez most függvény
Nézzük összefoglalva a végrehajtási preferenciát:
PowerShell kulcsszó
Alias
Függvény
Cmdlet
Futtatható fájlok (exe, com, stb.)
Szkriptek
Kiterjesztés alapján a hozzá tartozó alkalmazás futtatása
Azaz nagyon vigyázni kell, hogy milyen néven hozunk létre álneveket és függvényeket, mert ezek a végrehajtási preferenciában megelőzik a cmdleteket is. Például egy gonosz szkript átdefiniálhatja a gyári cmdleteket ugyanolyan nevű álnevekkel vagy függvényekkel és a PowerShell teljesen másként kezd el viselkedni, mint ahogy várjuk. Egyedül a PowerShell kulcsszavai élveznek viszonylagos védettséget, hiszen ha készítünk egy „FOR” nevű függvényt, akkor a FOR beírására az FOR ciklusként értelmezi a PowerShell, és az ugyanilyen nevű függvényem eléréséhez a fenti, körülményesebb módszert kell alkalmazni.
A precedenciák lehetnek nekünk jók vagy rosszak. Tegyük fel, hogy egy függvényt szeretnénk tesztelni, de abban szerepel egy Write-Host kifejezés, ami számomra fölösleges szöveget ír ki. Legyen a példa a következő:
function UpTimeHours {
$eredmény = (New-TimeSpan -Seconds ([environment]::TickCount/1000)).TotalHours
Write-Host "UpTime: $eredmény"
$eredmény
}
Ha el akarom nyomni az Write-Host cmdletet, egyszerűen definiálok egy Write-Host nevű teljesen üres függvényt:
function Write-Host {}
Futtatva az UpTimeHours függvényt nem lesz külön kiírás:
PS C:\> UpTimeHours
23,1405555555556
Mi van akkor, ha mégis használni akarom az eredeti Write-Host cmdletet? Használjuk a teljes nevét az őt definiáló modullal együtt:
PS C:\> Microsoft.PowerShell.Utility\Write-host -Object "Halihó" -ForegroundCol
or Green
Halihó
A biztonság szempontjából kritikus szkriptek esetében tehát akár az összes cmdletet ilyen módon hívva meg nem lehet könnyen eltéríteni a cmdletek eredeti működésétől, ettel fokozható a biztonság.