Kako opsegovi utječu na PowerShell skripte

Sadržaj:

Kako opsegovi utječu na PowerShell skripte
Kako opsegovi utječu na PowerShell skripte
Anonim
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 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.

Š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.

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 kojem to uopće nije bilo modificirano.
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 kojem to uopće nije bilo modificirano.

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.

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 morate redovito mijenjati varijable unutar skripte ili u okviru 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 učinite i pozovite to kad god su te promjene potrebne.
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 morate redovito mijenjati varijable unutar skripte ili u okviru 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 učinite i pozovite 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. 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' ''

Image
Image

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

Preporučeni: