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.