Što je opseg?
U PowerShell-u, "opseg" odnosi se na trenutni okoliš u kojem skript ili naredba ljuska djeluje. Ciljevi se upotrebljavaju za zaštitu određenih objekata u okolišu od neželjenog modificiranja pomoću skripti ili funkcija. Naročito, sljedeće su stvari zaštićene od modifikacije pomoću naredbi koje se pokreću iz drugog područja, osim ako parametri u tim naredbama nisu drugačije određeni:
- Varijable
- nadimci
- funkcije
- PowerShell pogoni (PSDrives)
Nove opsege stvaraju se svaki put kada pokrenete skriptu ili funkciju ili kada izradite novu sesiju ili instancu programa PowerShell. Okviri stvoreni pokretanjem skripti i funkcija imaju odnos "roditelj / dijete" s opsegom iz kojeg su stvoreni. Postoji nekoliko opsega koji imaju posebno značenja, a može se pristupiti imenom:
- Globalno opseg je opseg koji se stvara kada PowerShell počne. To uključuje varijable, pseudonime, funkcije i PSDrives koji su ugrađeni u PowerShell, kao i sve one koje napravite vašim PowerShell profilom.
- lokalne opseg se odnosi na ono što je trenutni opseg. Kada pokrenete PowerShell, to će se odnositi na opseg Global, unutar skripte bit će opseg Script, itd.
- skripta opseg se stvara kada se pokreće skripta. Jedine naredbe koje djeluju unutar ovog opsega su one koje su u skripti.
- Privatna opseg može biti definiran u trenutnom opsegu, kako bi se spriječile naredbe u drugim opsegima da mogu čitati ili mijenjati stavke na koje inače imaju pristup.
Područja se također mogu upućivati brojem u određenim naredbama, gdje se trenutni opseg naziva nula, a njegovi su se preci referiraju na sve veće brojeve. Na primjer, unutar pokreta skripte iz općeg područja, opseg Script bi bio 0, a opseg Globala bio bi 1. Opseg koji je dodatno ugniježđen unutar opsega Script, kao što je funkcija, odnosi se na opseg Global kao 2 Negativni brojevi neće raditi na referenciranju dječjih opsega - razlog za to bit će očito uskoro.
Kako opsegovi djeluju na naredbe
Kao što je ranije spomenuto, naredbe izvršene unutar jednog opsega neće utjecati na stvari u drugom opsegu, osim ako to nije izričito rečeno. Na primjer, ako $ MyVar postoji u opsegu Global i skripta pokreće naredbu za postavljanje $ MyVar na drugu vrijednost, Globalna verzija $ MyVar ostat će nepromijenjena dok je kopija $ MyVar postavljena u opseg Script s novim vrijednost. Ako $ MyVar ne postoji, skripta će ga prema zadanim postavkama stvoriti u opsegu Script, a ne u opsegu Global. Ovo je važno zapamtiti dok saznate o stvarnom odnosu roditelja / djeteta između opsega.
Roditelj / dijete odnosa opsega u PowerShellu je jednosmjeran. Naredbe mogu vidjeti i opcionalno mijenjati trenutni opseg, njegov roditelj i sve gore navedene opsege. Međutim, ne mogu vidjeti niti mijenjati stvari u bilo kojoj djeci trenutnog opsega. To je prije svega jer, nakon što ste se preselili u glavni opseg, dječji opseg već je uništen jer je ispunio svoju svrhu. Na primjer, zašto biste trebali vidjeti ili izmijeniti varijablu u opsegu Skripta, iz Općeg područja, nakon što je skripta prestala? Postoji mnogo slučajeva u kojima su vam potrebne izmjene skripte ili funkcije da se nastave nakon završetka, ali ne toliko gdje biste trebali izvršiti izmjene na objektima unutar opsega skripte ili funkcije prije ili poslije pokretanja. (Obično se takve stvari rješavaju kao dio skripte ili same funkcije.)
Naravno, što su pravila bez izuzetaka? Jedna iznimka od gore navedenih jesu Privatni opseg. Objekti u privatnim područjima dostupni su samo naredbama koje se pokreću u opsegu iz kojeg su stvorene. Druga važna iznimka su stavke koje imaju AllScope svojstvo. To su posebne varijable i aliase za koje će promjena u bilo kojem opsegu utjecati na sve opsege. Sljedeće naredbe će vam pokazati koje varijable i pseudonime imaju svojstvo AllScope:
Get-Variable | Where-Object {$_.Options -match 'AllScope'} Get-Alias | Where-Object {$_.Options -match 'AllScope')
Ciljevi na djelu
Za prvi pogled na djelove u akciji, započeti ćemo u sesiji PowerShell gdje je varijabla $ MyVar postavljena na niz, 'Ja sam globalna varijabla!', Iz naredbenog retka. Zatim će se sljedeća skripta pokrenuti iz datoteke koja se zove Scope-Demo.ps1:
Function FunctionScope { 'Changing $MyVar with a function.' $MyVar = 'I got set by a function!' 'MyVar says $MyVar' } '' 'Checking current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' '' FunctionScope '' 'Checking final value of MyVar before script exit.' 'MyVar says $MyVar' ''
Ako su PowerShell skripte funkcionirale isto kao i skupno pismo, očekujemo da se vrijednost $ MyVar (ili% MyVar% u sintaksi batchova) promijeni iz "Ja sam globalna varijabla!", Na "Pripremio sam skriptu!", i konačno, "dobio sam određenu funkciju!" gdje će ostati dok se ne bude izričito promijenila ili se sjednica prekine. Međutim, pogledajte što se ovdje zapravo događa dok se krećemo kroz svaku opsegu - osobito nakon što funkcija FunctionScope dovrši svoj rad i ponovno provjeravamo varijablu iz Skripte, a kasnije Globalnog opsega.
Postizanje izvan lokalnog područja
Dakle, to je dobro i dobro da vam pomogne da ne slučajno primijenite promjene u okruženju izvan vaših skripti i funkcija, ali što ako zapravo želite napraviti takve izmjene? Postoji posebna, i prilično jednostavna sintaksa za izradu i modificiranje objekata izvan lokalnog opsega. Upotrijebili ste naziv opsega na početku naziva varijable i stavite dvotočku između opsega i naziva varijabli. Kao ovo:
$global:MyVar $script:MyVar $local:MyVar
Te modifikatore možete koristiti prilikom pregledavanja i postavljanja varijabli. Pogledajmo što se događa s ovom demonstracijskom skriptom:
Function FunctionScope { '' 'Changing $MyVar in the local function scope…' $local:MyVar = 'This is MyVar in the function's local scope.' 'Changing $MyVar in the script scope…' $script:MyVar = 'MyVar used to be set by a script. Now set by a function.' 'Changing $MyVar in the global scope…' $global:MyVar = 'MyVar was set in the global scope. Now set by a function.' '' 'Checking $MyVar in each scope…' 'Local: $local:MyVar' 'Script: $script:MyVar' 'Global: $global:MyVar' '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''
Kao i prije, počet ćemo postavljanjem varijable u globalnom opsegu i završit ćemo provjerom konačnog rezultata globalnog opsega.
Kao što je ranije spomenuto, brojevi opsega se također mogu koristiti u određenim naredbama za promjenu varijable na različitim razinama u odnosu na lokalni opseg. Ovdje je ista skripta koja se upotrebljava u gornjem gornjem primjeru, ali s funkcijom modificiranom za upotrebu naredbi Get-Variable i Set-Variable s brojevima opsega umjesto izravnog referiranja varijable s imenom opsega:
Function FunctionScope { '' 'Changing $MyVar in scope 0, relative to FunctionScope…' Set-Variable MyVar 'This is MyVar in the function's scope 0.' –Scope 0 'Changing $MyVar in scope 1, relative to FunctionScope…' Set-Variable MyVar 'MyVar was changed in scope 1, from a function.' –Scope 1 'Changing $MyVar in scope 2, relative to Functionscope…' Set-Variable MyVar 'MyVar was changed in scope 2, from a function.' –Scope 2 '' 'Checking $MyVar in each scope…' ‘Scope 0:’ Get-Variable MyVar –Scope 0 –ValueOnly ‘Scope 1:’ Get-Variable MyVar –Scope 1 –ValueOnly ‘Scope 2:’ Get-Variable MyVar –Scope 2 –ValueOnly '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''
Slično kao i prije, ovdje možemo vidjeti kako naredbe u jednom opsegu mogu mijenjati objekte u svom glavnom opsegu.
dodatne informacije
Postoji još mnogo toga što se može učiniti s opsegom nego što se može uklopiti u ovaj članak. Područja djelovanja utječu na više od pukih varijabli, a još ih treba naučiti o privatnim opsegima i varijablama AllScope. Za više korisnih informacija, možete pokrenuti sljedeću naredbu unutar sustava PowerShell:
Get-Help about_scopes
Ista datoteka za pomoć dostupna je i na TechNet-u.
Opseg bonusa slike: spadassin on openclipart