Végrehajtási precedencia

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.



Word To HTML Converter