Változók kiszippantása a szkriptekből (dot sourcing)

A függvényeknél már látott, de a scripteknél még gyakrabban alkalmazott dotsourcing lehetőséget elevenítsük fel ismét. Ehhez hasonló szolgáltatással korábban (cmd, VBScript, stb.) egyáltalán nem találkozhattunk. Készítsük el a következő szkriptet, akár a Notepad segítségével:

$a = "egyik-"

$b = "másik"

$c = $a + $b

"`$c = $c"

Mentsük el a fájlt, mondjuk a c:\scripts mappába source.ps1 néven! Ezután futtassuk le az elkészült szkriptet, ami kiírja a $c változó tartalmát, majd a szkript lefutása után nézzük meg, milyen érték van a $c változóban! A helyes tipp az, hogy semmilyen. Ez így természetes, a szkript és a konzol külön munkamenetnek tekintendő, a szkript a konzol „gyerekkörnyezete”, a konzol ezért nem éri el a gyereke adatait.

PS C:\> c:\scripts\source.ps1

$c = egyik-másik

PS C:\> $c

PS C:\>

Eddig tehát tulajdonképpen semmi meglepőt nem tapasztaltunk, inkább az lett volna furcsa, ha nem így van. Ha azonban a korában látott „dotsourcing” ( 1.6.5 Függvények láthatósága, „dotsourcing” fejezet) módon indítjuk el szkriptünket, akkor a függvényeknél már látottaknak megfelelően a változó elérhetővé válik:

PS C:\> . c:\scripts\source.ps1

$c = egyik-másik

PS C:\> $c

egyik-másik

A konzol munkamenet, a globális scope „tudja”, hogy mi volt a változó értéke a szkriptben, ami már réges-rég véget ért. Ez a jelenség a függvényeknél már megismert „dotsourcing ”, amelynek hatására a szkript valamennyi változója az őt meghívó környezet változójává alakult, jelen esetben globálissá vált, vagyis minden munkamenet (így a konzol és más szkriptek is) elérhetik, felhasználhatják és megváltoztathatják a bennük tárolt értékeket még akkor is, amikor az őket létrehozó munkamenet (vagyis a szkript) már bezárult.

Talán ez már nyilvánvaló, hogy milyen hasznos ez a lehetőség, hiszen így a szkript által lekérdezett, létrehozott adatszerkezetek (például egy adatbázisból, vagy az Active Directoryból származó adathalmaz) a szkript lefuttatása után interaktív üzemmódban is listázhatók, feldolgozhatók. Vagyis egyszerre élvezhetjük a szkript- és az interaktív üzemmód előnyeit. Ha egy feladat egyik részét inkább szkriptként érdemes elkészíteni, de más részeknél egyszerűbb az interaktív üzemmód használata, akkor bátran használhatjuk ezt a lehetőséget, mindent olyan módon végezhetünk el, ahogy az a legkedvezőbb.

Még egy dolog jegyzendő meg itt. Nézzünk egy olyan szkriptet, ami tartalmaz még egy függvénydefiníciót is:

param ($x)

$a = "Ez a script változója"

function belsőfv ($y)

{

     $a = "Ez a fv változója"

     $x

     $y

     $a

     $script:a

     $global:a

}

 

belsőfv "Y értéke"

Ebben a szkriptben minden jó van: átadott paraméter, belső változó, függvénydefiníció, a függvénynek saját változója. Ráadásul „a” nevű változó mindenütt lehet. Definiálok tehát egy „külső” $a változót és futtatom a szkriptet egy átadott paraméterrel:

PS C:\> $a = "Globális A"

PS C:\> .\_munka\scriptscope.ps1 "Ez az X értéke"

Ez az X értéke

Y értéke

Ez a fv változója

Ez a script változója

Globális A

Látható, hogy minden szint $a változóját meg tudtam jeleníteni. A szkriptnek tehát van egy külön érvényességi területe, ez pedig a script.



Word To HTML Converter