U skupnim skriptama, promjene varijabli okoline imaju globalni utjecaj na trenutačnu sesiju prema zadanim postavkama. Za PowerShell, upravo suprotno je istina jer se opsega koriste za izoliranje izmjena skripte. Ovdje ćemo istražiti kako opseg djeluje na skripte PowerShell i kako raditi u njima i oko njih.
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:
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:
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.
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 | Gdje-Objekt $ _. Opcije -match 'AllScope' Get-Alias | Gdje-Objekt $ _. Opcije -match 'AllScope')
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:
Funkcija FunctionScope 'Promjena $ MyVar s funkcijom.' $ MyVar = 'Postao sam određen funkcijom!' "MyVar kaže $ MyVar" "Provjera trenutne vrijednosti od $ MyVar." "MyVar kaže $ MyVar" "Promjena $ MyVar skripte". $ MyVar = 'Postao sam skripta!' "MyVar kaže $ MyVar" "FunctionScope" Provjera konačne vrijednosti MyVar prije izvođenja skripte. " "MyVar kaže $ 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 eksplicitno ne promijeni ili prestane sjednica.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.
Kao što možete vidjeti, varijabla se čini da se mijenja dok smo se preselili u skriptu jer smo sve dok funkcija FunctionScope nije dovršena provjeravali varijablu iz istog opsega zadnje promijenjene. Međutim, nakon funkcije FunctionScope, vratili smo se natrag u Script opseg gdje je $ MyVar ostalo netaknut funkcijom. Zatim, kada je skripta prestala, vratili smo se u globalni opseg u kojemu uopće nije bilo modificirano.
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:
$ globalno: MyVar $ script: MyVar $ local: MyVar
Te modifikatore možete koristiti prilikom pregledavanja i postavljanja varijabli. Pogledajmo što se događa s ovom demonstracijskom skriptom:
Funkcija FunctionScope "Promjena $ MyVar u opsegu lokalne funkcije ..." $ local: MyVar = "Ovo je MyVar u lokalnom opsegu funkcije." 'Promjena $ MyVar u opsegu skripte ...' $ script: MyVar = 'MyVar je bio koji je postavljen pomoću skripte, a sada je određena funkcijom. "Promjena $ MyVar u globalnom opsegu ..." $ global: MyVar = "MyVar je postavljen u globalnom opsegu. Sada postavljena funkcijom "Provjera $ MyVar u svakom opsegu ..." "Lokalno: $ local: MyVar" "Skripta: $ script: MyVar" "Globalno: $ globalno: MyVar" "" Dobivanje trenutne vrijednosti od $ MyVar. " "MyVar kaže $ MyVar" "Promjena $ MyVar skripte". $ MyVar = 'Postao sam skripta!' "MyVar kaže $ MyVar" FunctionScope "Provjera $ MyVar iz opsega skripte prije izlaska". "MyVar kaže $ MyVar" "
Kao i prije, započinjemo postavljanjem varijable u globalnom opsegu i završit ćemo provjerom posljednjeg opsega Globalnog opsega.
Ovdje možete vidjeti da je FunctionScope mogao mijenjati varijablu u opsegu Script, a promjene će se nastaviti nakon dovršetka. Također, promjena varijable u svjetskom opsegu nastavila se i nakon što je skripta izašla. To može biti osobito korisno ako opetovano promijenite varijable unutar skripte ili unutar globalnog opsega koristeći isti kôd - samo definirate funkciju ili skriptu koja je napisana kako bi promijenila varijablu gdje i kako vam je potrebna, a nazovite to kad god su te promjene potrebne.
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. Evo iste skripte upotrijebljene u gornjem gornjem primjeru, ali s funkcijom modificiranom za upotrebu naredbi Get-Variable i Set-Variable s brojevima opsega umjesto izravnog upućivanja na varijablu s imenom opsega:
Funkcija FunctionScope "Promjena $ MyVar u opsegu 0, u odnosu na FunctionScope ..." Set-Variable MyVar "Ovo je MyVar u opsegu funkcije 0." -Scope 0 "Promjena $ MyVar u opsegu 1, u odnosu na FunctionScope ..." Set-Variable MyVar 'MyVar promijenjen je u opsegu 1, iz neke funkcije.' -Scope 1 'Promjena $ MyVar u okviru 2, u odnosu na Functionscope ...' Set-Variable MyVar 'MyVar je promijenjen u opsegu 2, iz neke funkcije.' -Scope 2 "Provjera $ MyVar u svakom opsegu ..." Opseg 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Opseg 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Opseg 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" Dobivanje trenutne vrijednosti od $ MyVar. " "MyVar kaže $ MyVar" "Promjena $ MyVar skripte". $ MyVar = 'Postao sam skripta!' "MyVar kaže $ MyVar" FunctionScope "Provjera $ MyVar iz opsega skripte prije izlaska". "MyVar kaže $ MyVar" "
Slično kao i prije, ovdje možemo vidjeti kako naredbe u jednom opsegu mogu mijenjati objekte u svom glavnom opsegu.
Ima još mnogo toga što se može učiniti s opsegom nego što se može uklopiti u ovaj članak. Ciljevi utječu na više od pukih varijabli, a još ih se više može 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