Pagina principala » HOWTO » Cum Scopes afectează scripturile PowerShell

    Cum Scopes afectează scripturile PowerShell

    În scripturile batch, modificările la variabilele de mediu au un impact global asupra sesiunii curente în mod implicit. Pentru PowerShell, exact opusul este adevărat deoarece scopurile sunt folosite pentru a izola modificările unui script. Aici, vom explora modul în care scopurile afectează scripturile PowerShell și cum să lucreze în și în jurul lor.

    Ce este un domeniu??

    În PowerShell, un "domeniu" se referă la mediul actual în care funcționează un script sau un shell de comandă. Scopurile sunt folosite pentru a proteja anumite obiecte din mediul înconjurător de a fi modificate neintenționat de scripturi sau funcții. În mod special, următoarele lucruri sunt protejate împotriva modificării prin comenzi rulate dintr-un alt domeniu de aplicare, cu excepția cazului în care se specifică altfel parametrii din acele comenzi:

    • variabile
    • Pseudonime
    • funcţii
    • Unități PowerShell (PSDrives)

    Domeniile noi sunt create ori de câte ori executați un script sau o funcție sau când creați o nouă sesiune sau instanță a PowerShell. Scopurile create de rularea de scripturi și funcții au o relație "părinte / copil" cu domeniul de aplicare din care au fost create. Există câteva domenii care au înțelesuri deosebit de speciale și pot fi accesate prin nume:

    • Global domeniul de aplicare este domeniul de aplicare care este creat atunci când pornește PowerShell. Acesta include variabilele, pseudonimele, funcțiile și PSDrives-urile care sunt încorporate în PowerShell, precum și toate cele făcute de profilul PowerShell.
    • Local domeniul de aplicare se referă la orice domeniu de aplicare actual. Când porniți PowerShell se va referi la domeniul global, în cadrul unui script va fi domeniul Script, etc.
    • scenariu domeniul este creat atunci când un script este rulat. Singurele comenzi care funcționează în acest scop sunt cele din scenariu.
    • Privat domeniile pot fi definite în limitele actuale, pentru a împiedica comenzile din alte domenii să fie capabile să citească sau să modifice elemente pe care altfel ar putea avea acces la.

    Scopurile pot fi, de asemenea, numite în număr în anumite comenzi, unde domeniul de aplicare curent este referit la zero și strămoșii săi sunt menționați prin creșterea numărului întreg. De exemplu, în cadrul unui script executat din domeniul global, domeniul de aplicare a Script-ului ar fi 0, iar domeniul de aplicare global ar fi 1. Un domeniu care a fost în continuare implantat în sfera Script, cum ar fi o funcție, se referă la domeniul global ca 2 Numerele negative nu vor funcționa pentru a referenți scopurile copilului - motivul pentru care va fi evident în scurt timp.

    Cum Scopes afectează comenzile

    Așa cum am menționat mai devreme, comenzile executate în cadrul unui domeniu de aplicare nu vor afecta lucrurile într-un alt domeniu, dacă nu li se va spune în mod expres acest lucru. De exemplu, dacă $ MyVar există în domeniul global și un script rulează o comandă pentru a seta $ MyVar la o valoare diferită, versiunea globală a lui $ MyVar va rămâne neschimbată în timp ce o copie a lui $ MyVar este plasată în domeniul Script cu noua valoare. Dacă un $ MyVar nu există, un script îl va crea în scop Script în mod implicit - nu în domeniul global. Acest lucru este important de reținut în timp ce aflați despre relația reală părinte / copil dintre domenii.

    Relația mamă / copil a domeniilor în PowerShell este una. Comenzile pot vedea și pot modifica opțional domeniul de aplicare curent, părintele său și toate domeniile de mai sus. Cu toate acestea, nu pot vedea sau modifica lucrurile la niciun copil din domeniul de aplicare actual. Acest lucru se datorează în primul rând faptului că, odată ce v-ați mutat într-un scop parental, domeniul copilului a fost deja distrus pentru că și-a îndeplinit scopul. De exemplu, de ce ar trebui să vedeți sau să modificați o variabilă în domeniul Script, din domeniul de aplicare global, după terminarea scriptului? Există o mulțime de cazuri în care aveți nevoie ca schimbările unui script sau ale funcției să persiste dincolo de completarea acestuia, dar nu atât de multe în cazul în care va trebui să faceți modificări obiectelor din sfera de aplicare a scriptului sau a funcției înainte sau după rularea acestuia. (De obicei, astfel de lucruri vor fi tratate, oricum, ca parte a scriptului sau a funcției.)

    Desigur, care sunt regulile fără excepții? O excepție de la cele de mai sus sunt domenii private. Obiectele din domeniul privat sunt accesibile numai comenzilor care se execută în domeniul de aplicare din care au fost create. O altă excepție importantă sunt articolele care au proprietatea AllScope. Acestea sunt variabile speciale și aliasuri pentru care o schimbare în orice domeniu de aplicare va afecta toate domeniile. Următoarele comenzi vă vor arăta care variabile și aliasuri au proprietatea AllScope:

    Get-Variable | Unde-Obiect $ _ Opțiuni -match 'AllScope' Get-Alias ​​| Unde-Obiect $ _ Opțiuni -match "AllScope")

    Scopes în acțiune

    Pentru prima noastră viziune asupra domeniilor în acțiune, vom începe într-o sesiune PowerShell unde variabila $ MyVar a fost setată la un șir, "Sunt o variabilă globală!", Din linia de comandă. Apoi, următorul script va fi rulat dintr-un fișier numit Scope-Demo.ps1:

    Function FunctionScope 'Schimbarea $ MyVar cu o functie.' $ MyVar = 'Am stabilit printr-o funcție!' "MyVar spune $ MyVar" "Verificarea valorii curente a lui $ MyVar." "MyVar spune $ MyVar" "Schimbarea $ MyVar prin script." $ MyVar = 'Am fost pus de un scenariu!' "MyVar spune $ MyVar" "FunctionScope" Verificarea valorii finale a MyVar înainte de ieșirea din script. " "MyVar spune $ MyVar" "

    Dacă script-urile PowerShell au lucrat la fel ca și scripturile batch, ne-am aștepta ca valul $ MyVar (sau% MyVar% în sintaxa lotului) să se schimbe de la 'Sunt o variabilă globală!', La 'Am stabilit printr-un script! , și în cele din urmă la "M-am pus de o funcție!" unde ar rămâne până când se va schimba în mod explicit din nou sau dacă sesiunea nu va mai fi terminată. Cu toate acestea, a se vedea ce se întâmplă de fapt aici, pe măsură ce trecem prin fiecare domeniu - în special, după ce funcția FunctionScope și-a finalizat activitatea și verificăm din nou variabila din Script și mai târziu domeniul global.

    După cum vedeți variabila părea să se schimbe pe măsură ce ne-am mutat prin script deoarece, până când funcția FunctionScope a fost finalizată, verificam variabila din același domeniu de aplicare pe care a fost modificată ultima dată. După ce a fost efectuat funcția FunctionScope, ne-am mutat înapoi în sfera scenariului unde $ MyVar a rămas neatins de această funcție. Apoi, când scenariul sa terminat, am revenit în sfera globală în care nu a fost modificată deloc.

    Atingerea în afara domeniului de aplicare local

    Deci, toate acestea sunt bune și bune pentru a vă ajuta să păstrați de la aplicarea accidentală a schimbărilor în mediul înconjurător dincolo de scenariile și funcțiile dvs., dar ce dacă doriți să faceți astfel de modificări? Există o sintaxă specială și destul de simplă pentru crearea și modificarea obiectelor dincolo de domeniul de aplicare local. Tocmai ați pus numele de domeniu la începutul numelui variabilei și ați pus un punct între numele domeniului și numele variabilei. Asa:

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

    Puteți utiliza acești modificatori atât la vizualizarea, cât și la setarea variabilelor. Să vedem ce se întâmplă cu acest scenariu demonstrativ:

    Funcția FunctionScope "Schimbarea lui $ MyVar în domeniul de funcții locale ..." $ local: MyVar = "Acesta este MyVar în domeniul de aplicare al funcției locale" "Schimbarea $ MyVar în sfera de aplicare a scenariului ..." $ script: MyVar = setat de un script Acum setat de o funcție. "Schimbarea $ MyVar în domeniul global ..." $ global: MyVar = 'MyVar a fost setat în domeniul global. Acum, setat de o funcție. "Verificarea $ MyVar în fiecare domeniu de aplicare ..." "Local: $ local: MyVar" "Script: $ script: MyVar" "Global: $ global: MyVar" " Obținerea valorii curente $ MyVar. "MyVar spune $ MyVar" "Schimbarea $ MyVar prin script." $ MyVar = 'Am fost pus de un scenariu!' "MyVar spune că $ MyVar" FunctionScope "verifică $ MyVar din domeniul de aplicare al scenariului înainte de ieșire." "MyVar spune $ MyVar" "

    Ca și până acum, vom începe prin stabilirea variabilei în domeniul global și se va încheia cu verificarea finalului final al domeniului global.

    Aici puteți vedea că funcția FunctionScope a reușit să schimbe variabila în domeniul Script și să aibă modificările persistă după ce a fost terminată. De asemenea, schimbarea la variabila din domeniul Global a persistat chiar și după terminarea scenariului. Acest lucru poate fi util în special dacă trebuie să modificați în mod variabil variabilele într-un script sau în domeniul global, utilizând același cod - pur și simplu definiți o funcție sau un script scrise pentru a modifica variabila unde și cum aveți nevoie de ea și apelați la aceasta ori de câte ori aceste modificări sunt necesare.

    Așa cum am menționat mai devreme, numerele de domeniu pot fi de asemenea utilizate în anumite comenzi pentru a modifica variabila la diferite nivele în raport cu domeniul local. Iată același script utilizat în cel de-al doilea exemplu de mai sus, dar cu funcția modificată pentru a utiliza comenzile Get-Variable și Set-Variable cu numere de domeniu în loc să se refere direct cu variabilele numite scopes:

    Function FunctionScope "Schimbarea $ MyVar in domeniul 0, relativ la FunctionScope ..." Set-Variable MyVar "Acesta este MyVar in domeniul 0." -Scope 0 "Schimbarea $ MyVar in domeniul 1, relativ la FunctionScope ... Set-Variable MyVar 'MyVar a fost schimbat în domeniul 1, dintr-o funcție.' -Scopul 1 'Schimbarea $ MyVar în domeniul 2, față de Functionscope ...' Set-Variable MyVar 'MyVar a fost schimbat în domeniul 2, dintr-o funcție. -Scopul 2 "Verificarea $ MyVar în fiecare domeniu de aplicare ..." Scopul 0: "Obțineți -Variabil MyVar -Scope 0 -ValueOnly" Domeniul 1: "Obțineți -Variabil MyVar -Scopul 1 -ValueOnly" Domeniul 2: "GetVariable MyVar -Scope 2 -ValueOnly "" Obținerea valorii curente a $ MyVar. " "MyVar spune $ MyVar" "Schimbarea $ MyVar prin script." $ MyVar = 'Am fost pus de un scenariu!' "MyVar spune că $ MyVar" FunctionScope "verifică $ MyVar din domeniul de aplicare al scenariului înainte de ieșire." "MyVar spune $ MyVar" "

    Similar cu înainte, putem vedea aici cum comenzile dintr-un domeniu de aplicare pot modifica obiectele din domeniul său de aplicare.

    informatii suplimentare

    Există încă mult mai multe lucruri care se pot face cu scopuri decât se pot potrivi în acest articol. Scopurile afectează mai mult decât variabilele și mai sunt multe de învățat despre domeniile private și variabilele AllScope. Pentru informații mai utile, puteți rula următoarea comandă din PowerShell:

    Obțineți-Help about_scopes

    Același fișier de ajutor este, de asemenea, disponibil în TechNet.


    Scopul creditului imagine: spadassin pe openclipart