Početna » kako da » Kako opsezi utječu na skripte PowerShell

    Kako opsezi utječu na skripte PowerShell

    U skupnim skriptama promjene varijabli okruženja imaju globalni utjecaj na trenutnu sesiju prema zadanim postavkama. Za PowerShell, točno suprotno je istina jer se opsezi koriste za izoliranje izmjena skripte. Ovdje ćemo istražiti kako područja rada utječu na PowerShell skripte i kako raditi u njima i oko njih.

    Što je opseg?

    U programu PowerShell, "scope" se odnosi na trenutnu okolinu u kojoj operira skripta ili naredbena ljuska. Područja se koriste za zaštitu određenih objekata u okolini od nenamjerne promjene skripti ili funkcija. Osobito, sljedeće stvari su zaštićene od izmjene naredbama koje se pokreću iz drugog opsega, osim ako parametrima u tim naredbama nije drugačije određeno:

    • Varijable
    • nadimci
    • funkcije
    • Pogoni PowerShell (PSDrives)

    Novi opsezi stvaraju se svaki put kada pokrenete skriptu ili funkciju, ili kada stvorite novu sesiju ili instancu PowerShell-a. Područja kreirana pokretanjem skripti i funkcija imaju odnos "roditelj / dijete" s opsegom iz kojeg su stvoreni. Postoji nekoliko područja koja imaju posebno posebna značenja i kojima se može pristupiti imenom:

    • Globalno opseg je područje koje se stvara kada se pokrene PowerShell. Uključuje varijable, pseudonime, funkcije i PSDrives koji su ugrađeni u PowerShell, kao i sve koje je napravio vaš PowerShell profil.
    • lokalne opseg se odnosi na bilo koji trenutni opseg. Kada pokrenete PowerShell to će se odnositi na globalni opseg, unutar skripte to će biti područje skripte, itd.
    • skripta opseg se stvara kada se pokrene skripta. Jedine naredbe koje djeluju unutar tog opsega su one koje su u skripti.
    • Privatna opsezi mogu biti definirani unutar trenutnog opsega, kako bi se spriječilo da naredbe u drugim opsezima mogu čitati ili mijenjati stavke koje bi inače imale pristup.

    Područja se također mogu odnositi na broj u određenim naredbama, gdje se trenutni opseg naziva nula, a njegovi preci se navode povećanjem cijelih brojeva. Na primjer, unutar skripte koja se pokreće iz Globalnog opsega, Script opseg bi bio 0, a Globalni opseg bi bio 1. Opseg koji je dalje ugrađen u područje Scripta, kao što je funkcija, odnosi se na globalni opseg kao 2 Negativni brojevi neće raditi na referentnim dijelovima djeteta - razlog za to će uskoro biti vidljiv.

    Kako utjecaji djeluju na naredbe

    Kao što je ranije spomenuto, naredbe izvršene unutar jednog opsega neće utjecati na stvari u drugom opsegu, osim ako je izričito rečeno da to učine. Na primjer, ako $ MyVar postoji u Globalnom opsegu, a skripta pokreće naredbu da postavi $ MyVar na drugu vrijednost, Globalna verzija $ MyVar će ostati nepromijenjena dok će kopija $ MyVar biti stavljena u područje Scripta s novim vrijednost. Ako $ MyVar ne postoji, skripta će ga stvoriti unutar opsega Skripta po defaultu - ne u Globalnom opsegu. Ovo je važno zapamtiti dok učite o stvarnom odnosu roditelja i djeteta između područja.

    Odnos roditelj / dijete opsega u PowerShell-u je jednosmjerna. Naredbe mogu vidjeti, i opcionalno modificirati, trenutni opseg, njegov nadređeni i bilo koji opseg iznad toga. Međutim, oni ne mogu vidjeti niti mijenjati stvari u bilo kojoj djeci trenutnog opsega. To je prije svega zato što se, nakon premještanja u nadređeni opseg, dječji opseg već uništio jer je ispunio svoju svrhu. Na primjer, zašto biste morali vidjeti ili mijenjati varijablu u opsegu Skripta, iz globalnog opsega, nakon što se skripta završi? Postoji mnogo slučajeva u kojima je potrebno promijeniti skriptu ili funkciju da se nastave i nakon njezina dovršavanja, ali ne toliko u kojima biste trebali napraviti promjene u objektima unutar opsega skripte ili funkcije prije ili nakon pokretanja. (Obično će takve stvari biti obrađene kao dio skripte ili će i same funkcionirati.)

    Naravno, koja su pravila bez iznimaka? Jedna iznimka gore navedenog su Privatni opsezi. Objekti u privatnim područjima dostupni su samo naredbama koje se pokreću u opsegu iz kojeg su izrađene. Druga važna iznimka su stavke koje imaju svojstvo AllScope. To su posebne varijable i pseudonime za koje će promjena u bilo kojem opsegu utjecati na sve opsege. Sljedeće naredbe prikazat će vam koje varijable i aliase imaju svojstvo AllScope:

    Get-Variable | Where-Object $ _. Opcije -match 'AllScope' Get-Alias ​​| Gdje-objekt $ _. Opcije -odgovara 'AllScope')

    Područja djelovanja

    Za naš prvi pogled na opsege u akciji, započet ćemo u PowerShell sesiji gdje je varijabla $ MyVar postavljena na string, 'ja sam globalna varijabla!', Iz naredbenog retka. Zatim će se sljedeća skripta pokrenuti iz datoteke Scope-Demo.ps1:

    Funkcija FunctionScope 'Promjena $ MyVar s funkcijom.' $ MyVar = 'Postavila me funkcija!' "MyVar kaže $ MyVar" "Provjera trenutne vrijednosti $ MyVar." "MyVar kaže $ MyVar" "Promjena $ MyVar prema skripti." $ MyVar = 'Postavio me je skripta!' "MyVar kaže $ MyVar" "FunctionScope" Provjera konačne vrijednosti MyVar prije izlaska iz skripte. " "MyVar kaže $ MyVar" "

    Ako su PowerShell skripte funkcionirale jednako kao i skripte skupa, očekivali bismo da se vale od $ MyVar (ili% MyVar% u sintaksi serije) promijeni s "Ja sam globalna varijabla!", Na "Postavio sam ga skriptom!" , i konačno do "dobio sam određenu funkciju!" gdje će ostati dok se ne promijeni izričito ili se sesija prekine. Međutim, pogledajte što se zapravo događa ovdje dok se krećemo kroz svaki od opsega - osobito, nakon što je funkcija FunctionScope dovršila svoj rad i ponovno smo provjerili varijablu iz skripte, a kasnije i Global, opseg.

    Kao što možete vidjeti, varijabla se mijenjala dok smo se kretali kroz skriptu jer, sve dok funkcija FunctionScope nije dovršena, provjeravali smo varijablu iz istog opsega koji je zadnji put promijenjen. Nakon što je FunctionScope ipak učinjen, vratili smo se u područje Scripta gdje je funkcija MyVar ostala netaknuta. Zatim, kad je skripta prekinuta, vratili smo se u globalni opseg gdje uopće nije izmijenjen.

    Dostizanje izvan lokalnog opsega

    Dakle, sve je to dobro i dobro da bi vam pomoglo da ne primijenite promjene u okruženju izvan vaših skripti i funkcija, ali što ako zaista želite napraviti takve izmjene? Postoji posebna, i prilično jednostavna, sintaksa za stvaranje i izmjenu objekata izvan Lokalnog opsega. Samo stavite ime opsega na početak imena varijable i stavite dvotočku između naziva opsega i varijabli. Kao ovo:

    $ global: MyVar $ script: MyVar $ local: MyVar

    Ove modifikatore možete koristiti i prilikom pregledavanja i postavljanja varijabli. Da vidimo što će se dogoditi s ovom demonstracijskom skriptom:

    Funkcija FunctionScope "Promjena $ MyVar u opsegu lokalne funkcije ... '$ local: MyVar =" Ovo je MyVar u lokalnom opsegu funkcije. "' Mijenjanje $ MyVar u opsegu skripte ... '$ script: MyVar =' MyVar je nekad bio Postavio je skriptu. Sada postavite funkciju. "Promjena $ MyVar u globalnom opsegu ..." $ global: MyVar = 'MyVar je postavljen u globalnom opsegu. Sada postavite funkciju. "Provjera $ MyVar u svakom opsegu ..." "Lokalno: $ local: MyVar" "Skripta: $ script: MyVar" "Global: $ global: MyVar" "" Dobivanje trenutne vrijednosti $ MyVar. " "MyVar kaže $ MyVar" "Promjena $ MyVar prema skripti." $ MyVar = 'Postavio me je skripta!' "MyVar kaže $ MyVar" FunctionScope 'Provjera $ MyVar iz opsega skripte prije izlaza.' "MyVar kaže $ MyVar" "

    Kao i prije, počet ćemo postavljanjem varijable u Globalnom opsegu i završiti s provjerom konačnog rezultata Globalnog opsega.

    Ovdje možete vidjeti da je FunctionScope uspio promijeniti varijablu u opsegu Skripta, te da su promjene i dalje prisutne nakon dovršetka. Također, promjena varijable u Globalnom opsegu postojala je i nakon izlaska iz skripte. To može biti osobito korisno ako morate opetovano mijenjati varijable unutar skripte, ili unutar globalnog opsega, koristeći isti kod - samo definirajte funkciju ili skriptu koja je napisana za izmjenu varijable gdje i kako je potrebno i kad god su te promjene potrebne.

    Kao što je ranije spomenuto, brojevi opsega mogu se također koristiti u određenim naredbama za promjenu varijable na različitim razinama u odnosu na Lokalni opseg. Ovo je ista skripta koja se koristi u drugom primjeru gore, ali s funkcijom modificiranom za korištenje naredbi Get-Variable i Set-Variable s brojevima opsega umjesto izravne reference varijable s imenovanim opsezima:

    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 je promijenjen u opsegu 1, iz funkcije.' -Scope 1 'Promjena $ MyVar u opsegu 2, u odnosu na Funkcionalnost…' Set-Variable MyVar 'MyVar je promijenjen u opsegu 2, iz funkcije.' -Scope 2 "Provjera $ MyVar u svakom opsegu ..." Opseg 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Opseg 1: 'Get-Variable MyVar -Scope 1 -ValOnOnly' Scope 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" Dobivanje trenutne vrijednosti $ MyVar. " "MyVar kaže $ MyVar" "Promjena $ MyVar prema skripti." $ MyVar = 'Postavio me je skripta!' "MyVar kaže $ MyVar" FunctionScope 'Provjera $ MyVar iz opsega skripte prije izlaza.' "MyVar kaže $ MyVar" "

    Slično kao i prije, ovdje možemo vidjeti kako naredbe u jednom opsegu mogu mijenjati objekte u svom nadređenom 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 samo varijabli i još se mnogo toga može naučiti o privatnim opsezima i AllScope varijablama. Za više korisnih informacija možete pokrenuti sljedeću naredbu unutar PowerShell-a:

    Get-Help about_scopes

    Ista datoteka pomoći dostupna je i na TechNetu.


    Kreditna slika slike: spadassin on openclipart