Kako Scopes vplivajo na skripte PowerShell
V paketnih skriptih imajo spremembe spremenljivk okolja globalni vpliv na trenutno sejo po privzetku. Za PowerShell velja ravno nasprotno, ker se področja uporabljajo za izolacijo sprememb skripta. Tukaj bomo raziskali, kako področja vplivajo na skripte PowerShell in kako delati v njih in okoli njih.
Kaj je področje uporabe?
V programu PowerShell se "področje" nanaša na trenutno okolje, v katerem deluje skript ali ukazna lupina. Območja se uporabljajo za zaščito določenih objektov v okolju pred nenamernim spreminjanjem skriptov ali funkcij. Še posebej so naslednje stvari zaščitene pred spremembami z ukazi, ki se izvajajo iz drugega področja, če parametri v teh ukazih ne določajo drugače:
- Spremenljivke
- Vzdevki
- Funkcije
- Pogoni PowerShell (PSDrives)
Novi obsegi se ustvarijo, ko zaženete skript ali funkcijo ali ko ustvarite novo sejo ali primerek PowerShell. Področja, ki jih ustvarjajo teče skripte in funkcije, imajo razmerje »starš / otrok« z obsegom, iz katerega so bili ustvarjeni. Obstaja nekaj področij, ki imajo posebno posebne pomene in so dostopni po imenu:
- The Globalno področje je področje, ki se ustvari, ko se zažene PowerShell. Vključuje spremenljivke, vzdevke, funkcije in PSDrives, ki so vgrajeni v PowerShell, kot tudi vse, ki jih je ustvaril vaš profil PowerShell..
- The Lokalno se nanaša na kakršen koli trenutni obseg. Ko zaženete PowerShell, se bo nanašal na globalni obseg, znotraj skripta bo področje Script, itd.
- The Skript Območje je ustvarjeno, ko se izvaja skript. Edini ukazi, ki delujejo v tem obsegu, so tisti, ki so v skriptu.
- Zasebno področja, ki jih lahko določite v trenutnem obsegu, da preprečite, da bi lahko ukazi v drugih področjih brali ali spreminjali elemente, ki bi jih sicer imeli dostop do.
Na določenih ukazih se lahko sklicuje tudi na število, pri čemer je trenutni obseg označen kot nič in njegovi predniki so navedeni s povečanjem celih števil. Na primer, v skriptu, ki se izvaja v globalnem obsegu, je območje Skripta 0, globalno področje pa 1. Področje, ki je bilo nadalje ugnezdeno v področje Script, kot je funkcija, bi se nanašalo na globalno področje uporabe kot 2. Negativna števila ne bodo delovala na referenčne dele otroka - razlog za to bo kmalu razviden.
Kako vplivajo na ukaze
Kot smo že omenili, ukazi, ki se izvajajo v enem obsegu, ne bodo vplivali na stvari v drugem obsegu, razen če je to posebej navedeno. Na primer, če $ MyVar obstaja v globalnem obsegu in skript izvede ukaz za nastavitev $ MyVar na drugo vrednost, bo globalna različica $ MyVar ostala nespremenjena, medtem ko bo kopija $ MyVar postavljena v območje Script z novim vrednost. Če $ MyVar ne obstaja, ga bo skript po privzetku ustvaril znotraj področja Script - ne pa v globalnem obsegu. To je pomembno, da se spomnite, ko spoznate dejansko razmerje med starši in otroki med področji.
Odnos staršev / otrok med področji v programu PowerShell je enosmerna. Ukazi lahko vidijo in po želji spremenijo trenutni obseg, njegovo nadrejeno in katerikoli obseg nad njim. Vendar pa ne morejo videti ali spremeniti stvari v vseh otrocih trenutnega obsega. To je predvsem zato, ker je po tem, ko ste se premaknili v nadrejeno področje, podroÄ scopeje za otroka že uničeno, ker je izpolnilo svoj namen. Na primer, zakaj bi morali prikazati ali spremeniti spremenljivko v obsegu Skripta iz globalnega obsega, potem ko je skript končal? Obstaja veliko primerov, ko potrebujete spremembe skripte ali funkcije, ki se nadaljujejo po njenem zaključku, vendar ne toliko, kjer bi morali narediti spremembe objektov znotraj obsega skripta ali funkcije pred ali po zagonu. (Običajno bodo takšne stvari obravnavane kot del skripta ali pa bodo vseeno same delale.)
Seveda, kaj so pravila brez izjem? Edina izjema od zgoraj so zasebni obsegi. Predmeti v zasebnih merilih so dostopni le ukazi, ki se izvajajo v obsegu, iz katerega so bili ustvarjeni. Druga pomembna izjema so elementi, ki imajo lastnost AllScope. To so posebne spremenljivke in vzdevki, za katere bo sprememba v katerem koli obsegu vplivala na vse obsege. Naslednji ukazi vam bodo pokazali, katere spremenljivke in vzdevki imajo lastnost AllScope:
Get-Variable | Kje-predmet $ _. Možnosti-ujemanje 'AllScope' Get-Alias | Kje-predmet $ _. Možnosti-ujemanje 'AllScope')
Področja delovanja
Za naš prvi pogled na področje uporabe v akciji, bomo začeli v seji PowerShell, kjer je bila spremenljivka $ MyVar nastavljena na niz, "Jaz sem globalna spremenljivka!", Iz ukazne vrstice. Naslednji skript se bo zagnal iz datoteke Scope-Demo.ps1:
Funkcija FunctionScope 'Spreminjanje $ MyVar s funkcijo.' $ MyVar = 'Nastavil me je funkcija!' "MyVar pravi $ MyVar" "Preverjanje trenutne vrednosti $ MyVar." "MyVar pravi $ MyVar" "Spreminjanje $ MyVar s skriptom." $ MyVar = 'Nastavil sem ga skript!' "MyVar pravi $ MyVar" "FunctionScope" Preverjanje končne vrednosti MyVar pred izhodom iz skripta. " "MyVar pravi $ MyVar" "
Če so skripti PowerShell delovali enako kot paketne skripte, bi pričakovali, da se vrednost $ MyVar (ali% MyVar% v paketni sintaksi) spremeni iz »Jaz sem globalna spremenljivka!«, V »Imam nastavljen skript!«. , in končno na "Imam določeno funkcijo!" kjer bi ostala, dokler ni izrecno ponovno spremenjena ali seja prekinjena. Vendar pa si oglejte, kaj se dejansko dogaja tukaj, ko se premikamo skozi vsako področje - še posebej, ko je funkcija FunctionScope dokončala svoje delo in ponovno preverjamo spremenljivko iz Skripta, kasneje pa Global, področje.
Kot lahko vidite, se je spremenljivka spremenila, ko smo se premikali skozi skripto, ker smo do konca funkcije FunctionScope preverjali spremenljivko znotraj istega obsega, kot je bila nazadnje spremenjena. Ko je bila funkcija FunctionScope opravljena, smo se vrnili nazaj v področje Script, kjer je funkcija MyVar ostala nedotaknjena. Potem, ko se je scenarij končal, smo se vrnili v globalni obseg, kjer sploh ni bil spremenjen.
Doseganje zunaj lokalnega obsega
Torej, to je vse dobro in dobro, da vam pomaga preprečiti nenamerno spreminjanje okolja, ki presega vaše skripte in funkcije, toda kaj, če dejansko želite narediti takšne spremembe? Obstaja posebna in dokaj preprosta sintaksa za ustvarjanje in spreminjanje objektov izven obsega Lokalni. Samo ime obsega navedete na začetku imena spremenljivke in med imeni spremenljivk in spremenljivk postavite dvopičje. Všečkaj to:
$ global: Skript MyVar $: MyVar $ local: MyVar
Te modifikatorje lahko uporabite pri pregledovanju in nastavljanju spremenljivk. Poglejmo, kaj se zgodi s tem demonstracijskim skriptom:
Funkcija FunctionScope "Spreminjanje $ MyVar v obseg lokalne funkcije ... '$ local: MyVar =" To je MyVar v lokalnem obsegu funkcije. "' Spreminjanje $ MyVar v obseg skripta ... '$ script: MyVar =' MyVar je nekoč bil nastavi s funkcijo. "Spreminjanje $ MyVar v globalnem obsegu ..." $ global: MyVar = 'MyVar je bil nastavljen v globalnem obsegu. Sedaj nastavite s funkcijo. "Preverjanje $ MyVar v vsakem obsegu ..." "Lokalno: $ local: MyVar" "Skript: $ script: MyVar" "Globalno: $ global: MyVar" "" Pridobivanje trenutne vrednosti $ MyVar. " "MyVar pravi $ MyVar" "Spreminjanje $ MyVar s skriptom." $ MyVar = 'Nastavil sem ga skript!' "MyVar pravi $ MyVar" FunctionScope "Preverjanje $ MyVar iz obsega skripta pred izhodom." "MyVar pravi $ MyVar" "
Kot prej, bomo začeli z nastavitvijo spremenljivke v globalnem obsegu in končali s preverjanjem končnega globalnega rezultata.
Tukaj lahko vidite, da je FunctionScope lahko spremenil spremenljivko v obsegu Skript, in spremembe so obstajale, potem ko je bila končana. Tudi sprememba spremenljivke v obsegu Global je obstajala tudi po izhodu iz skripta. To je lahko še posebej uporabno, če morate znova uporabljati spremenljivke znotraj skripta ali v globalnem obsegu z isto kodo - določite funkcijo ali skript, ki je napisana za spreminjanje spremenljivke, kjer in kako jo potrebujete, in kljub temu, da so te spremembe potrebne.
Kot smo že omenili, lahko številke področja uporabe uporabimo tudi v določenih ukazih za spreminjanje spremenljivke na različnih ravneh glede na lokalni obseg. Tukaj je isti skript, uporabljen v drugem zgornjem primeru, vendar s funkcijo, spremenjeno za uporabo ukazov Get-Variable in Set-Variable s številkami področja, namesto da bi neposredno spremenili spremenljivko z imenovanimi obsegi:
Funkcija FunctionScope "Spreminjanje $ MyVar v obsegu 0, glede na FunctionScope ..." Set-Variable MyVar "To je MyVar v obsegu funkcije 0." -Scope 0 "Spreminjanje $ MyVar v obsegu 1, glede na FunctionScope ..." Set-Variable MyVar 'MyVar je bil spremenjen v obsegu 1 iz funkcije.' -Scope 1 'Spreminjanje $ MyVar v obsegu 2, glede na funkcijsko polje…' Set-Variable MyVar 'MyVar je bil spremenjen v obsegu 2, iz funkcije.' -Scope 2 "Preverjanje $ MyVar v vsakem obsegu…" Področje 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Področje 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Področje 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" Pridobivanje trenutne vrednosti $ MyVar. " "MyVar pravi $ MyVar" "Spreminjanje $ MyVar s skriptom." $ MyVar = 'Nastavil sem ga skript!' "MyVar pravi $ MyVar" FunctionScope "Preverjanje $ MyVar iz obsega skripta pred izhodom." "MyVar pravi $ MyVar" "
Podobno kot prej, lahko tukaj vidimo, kako lahko ukazi v enem področju spreminjajo predmete v nadrejenem obsegu.
Dodatne informacije
Še vedno je veliko več, kar je mogoče storiti z obsegom, kot se lahko prilega v ta članek. Področja vplivajo na več kot le na spremenljivke in še je treba naučiti več o zasebnih merilih in spremenljivkah AllScope. Za več koristnih informacij lahko iz PowerShell zaženete naslednji ukaz:
Get-Help about_scopes
Ista datoteka pomoči je na voljo tudi v TechNet.
Obseg kreditne slike: spadassin on openclipart