Kaip taikymo sritys veikia „PowerShell“ scenarijus
Partijos scenarijuose aplinkos kintamųjų pakeitimai pagal nutylėjimą yra bendro poveikio dabartinei sesijai. „PowerShell“ yra teisingas priešingas, nes skalės naudojamos scenarijaus pakeitimams atskirti. Čia ištirsime, kaip apimtys veikia „PowerShell“ scenarijus ir kaip dirbti jose ir jų aplinkoje.
Kas yra taikymo sritis?
„PowerShell“ „apimtis“ reiškia dabartinę aplinką, kurioje veikia scenarijus arba komandų apvalkalas. Taikymo sritis naudojama tam tikriems aplinkos objektams apsaugoti nuo netyčinio skriptų ar funkcijų pakeitimo. Ypač toliau išvardyti dalykai yra apsaugoti nuo pakeitimų komandomis, kurios vykdomos iš kitos srities, nebent parametrai kitose komandose yra nurodyti:
- Kintamieji
- Pseudonimai
- Funkcijos
- „PowerShell“ įrenginiai (PSDrives)
Nauji apimtys sukuriami, kai paleisite scenarijų ar funkciją arba kuriate naują seansą ar „PowerShell“ egzempliorių. Scenarijų ir funkcijų, sukurtų vykdant scenarijus ir funkcijas, santykiai su tėvais / vaikais yra susiję su taikymo sritimi, nuo kurios jie buvo sukurti. Yra keletas taikymo sričių, turinčių ypatingą reikšmę, ir jas galima pasiekti pagal pavadinimą:
- The Pasaulinis apimtis yra apimtis, kuri sukuriama pradėjus „PowerShell“. Jame yra kintamieji, slapyvardžiai, funkcijos ir „PSDrives“, kurie yra įmontuoti „PowerShell“, taip pat bet kokie „PowerShell“ profilio padariniai.
- The Vietinis taikymo sritis apima bet kokią dabartinę taikymo sritį. Kai paleisite „PowerShell“, jis bus susijęs su „Global” sritimi, o scenarijuje bus „Scenarijaus“ apimtis ir pan.
- The Scenarijus apimtis sukuriama, kai vykdomas scenarijus. Vienintelės komandos, kurios veikia šioje srityje, yra tos, kurios yra scenarijuje.
- Privatus apimtys gali būti apibrėžtos pagal dabartinę taikymo sritį, neleisti kitose srityse esančioms komandoms skaityti ar keisti elementų, kuriuos jie kitaip galėtų pasiekti.
Taikymo sritis taip pat galima nurodyti pagal skaičių tam tikrose komandose, kur dabartinė apimtis vadinama nuliu, o jo protėviai nurodomi didėjančiais sveikais skaičiais. Pavyzdžiui, scenarijuje, kuris vykdomas nuo visuotinio taikymo srities, scenarijaus apimtis būtų 0, o pasaulinė taikymo sritis būtų 1. Apimtis, kuri buvo papildomai įtraukta į scenarijaus taikymo sritį, pvz., Funkcija, būtų susijusi su pasauline taikymo sritimi kaip 2 Neigiami skaičiai neveiks, kad nukreiptų vaiko taikymo sritį, tačiau netrukus tai paaiškės.
Kaip Scopes veikia komandas
Kaip minėta anksčiau, vienoje srityje vykdomos komandos neturės įtakos kitai sričiai, nebent tai būtų konkrečiai nurodyta. Pavyzdžiui, jei „$ MyVar“ egzistuoja visuotinėje taikymo srityje ir scenarijus atlieka komandą nustatyti „MyVar“ kitokią vertę, visuotinė „$ MyVar“ versija išliks nepakitusi, kol „$ MyVar“ kopija bus įtraukta į scenarijaus taikymo sritį su nauju vertė. Jei $ MyVar neegzistuoja, scenarijus jį sukurs pagal scenarijų taikymo sritį pagal nutylėjimą, o ne pagal pasaulinę taikymo sritį. Tai svarbu nepamiršti, nes sužinosite apie faktinį tėvų / vaiko santykį tarp taikymo sričių.
Tėvų ir vaikų santykiai PowerShell srityje yra vienpusiai. Komandos gali matyti, ir pasirinktinai keisti dabartinę taikymo sritį, jos tėvą ir bet kokias sritis, esančias aukščiau. Tačiau jie negali matyti ar keisti jokių vaikų dabartinės apimties. Tai pirmiausia todėl, kad persikėlus į tėvų apimtį, vaiko apimtis jau buvo sunaikinta, nes ji įvykdė savo tikslą. Pvz., Kodėl turėtumėte matyti ar keisti kintamąjį scenarijaus apimtyje nuo visuotinio taikymo srities, kai scenarijus baigėsi? Yra daug atvejų, kai jums reikia scenarijaus ar funkcijos pakeitimų, kurie tęstųsi po jo užbaigimo, bet ne tiek daug, kur reikia atlikti pakeitimus scenarijaus ar funkcijos apimtimi prieš arba po jo vykdymo. (Paprastai tokie dalykai bus tvarkomi kaip scenarijaus dalis arba vistiek veiks.)
Žinoma, kokios yra taisyklės be išimčių? Viena iš pirmiau minėtų išimčių yra privačios taikymo sritys. Objektai privačiuose taikymo srityse pasiekiami tik komandoms, kurios vykdomos toje srityje, iš kurios jos buvo sukurtos. Kita svarbi išimtis yra elementai, turintys „AllScope“ nuosavybę. Tai yra specialūs kintamieji ir slapyvardžiai, kuriems bet kokio taikymo srities pakeitimas turės įtakos visiems taikymo sritims. Toliau pateiktos komandos parodys, kurie kintamieji ir slapyvardžiai turi „AllScope“ nuosavybę:
Kintamasis | Kur-Objektas $ _. Parinktys -Kaip „AllScope“ Gauti „Alias“ Kur-Objektas $ _. Parinktys -Kaip „AllScope“)
Veiklos sritys
Pirmą kartą žvelgdami į veikimo sritis, pradėsime „PowerShell“ sesiją, kurioje kintamasis $ MyVar buvo nustatytas į eilutę „Aš esu pasaulinis kintamasis!“, Iš komandų eilutės. Tada šis scenarijus bus paleistas iš failo, pavadinto Scope-Demo.ps1:
Funkcija FunctionScope '$ MyVar keitimas su funkcija.' $ MyVar = 'Aš nustatiau funkciją!' "MyVar sako $ MyVar" "Dabartinės $ MyVar vertės tikrinimas." „MyVar sako $ MyVar“ „$ MyVar keitimas scenarijumi“. $ MyVar = 'Aš nustatiau scenarijų!' „MyVar sako $ MyVar“ „FunctionScope“ „MyVar“ galutinės vertės patikrinimas prieš scenarijaus išėjimą. “ "MyVar sako $ MyVar" "
Jei „PowerShell“ scenarijai veikė taip pat, kaip partijos scenarijai, mes tikimės, kad $ MyVar slėnis (arba% MyVar% partijos sintaksėje) pereis nuo „Aš esu pasaulinis kintamasis!“ ir galiausiai „Aš nustatyčiau funkciją!“ kur jis liktų tol, kol jis dar kartą pasikeis arba sesija bus nutraukta. Tačiau pažiūrėkite, kas iš tikrųjų čia vyksta, kai mes pereiname per kiekvieną apimtį - ypač po to, kai funkcija „FunctionScope“ baigė darbą ir mes dar kartą patikriname kintamąjį iš „Script“, o vėliau „Global“ apimties.
Kaip matote, kintamasis, atrodo, pasikeitė, kai persikėlėme per scenarijų, nes iki funkcijos „FunctionScope“ pabaigos, mes patikrinome kintamąjį iš tos pačios apimties, kur paskutinį kartą jis buvo pakeistas. Nepaisant to, kad „FunctionScope“ buvo atlikta, mes persikėlėme į „Scenarijų“ sritį, kur $ MyVar buvo paliktas nepaliestas. Tada, kai scenarijus buvo nutrauktas, mes grįžome į pasaulinę sritį, kur ji visai nebuvo pakeista.
Pasiekiamas ne vietos mastu
Taigi, tai viskas gerai ir gerai, kad galėtumėte netyčia netiesiogiai pritaikyti aplinkos pokyčius už jūsų scenarijų ir funkcijų, tačiau ką daryti, jei iš tikrųjų norite padaryti tokius pakeitimus? Yra ypatinga ir gana paprasta sintaksė, skirta kurti ir modifikuoti objektus, esančius už vietinės srities ribų. Tiesiog įterpiate taikymo srities pavadinimą kintamojo pavadinimo pradžioje ir įdėkite dvitaškį tarp taikymo srities ir kintamųjų pavadinimų. Kaip šitas:
$ global: MyVar $ scenarijus: MyVar $ local: MyVar
Šiuos modifikatorius galite naudoti peržiūrint ir nustatant kintamuosius. Pažiūrėkime, kas atsitiks su šiuo demonstravimo scenarijumi:
Funkcija FunctionScope "Vietos funkcijų taikymo srities $ MyVar keitimas ..." $ local: MyVar = "Tai yra MyVar funkcijos vietinėje taikymo srityje." '$ MyVar keitimas scenarijaus taikymo srityje ...' $ scenarijus: MyVar = 'MyVar anksčiau buvo Dabar nustatoma pagal funkciją. "$ MyVar keitimas pasaulinėje srityje ..." $ global: MyVar = 'MyVar buvo nustatytas visame pasaulyje. „Nustatykite $ MyVar kiekvienoje srityje…“ „Local: $ local: MyVar“ „Scenarijus: $ script: MyVar“ „Global: $ global: MyVar“ "" Dabartinės $ MyVar vertės gavimas. " „MyVar sako $ MyVar“ „$ MyVar keitimas scenarijumi“. $ MyVar = 'Aš nustatiau scenarijų!' „MyVar sako $ MyVar“ „FunctionScope“ „$ MyVar“ tikrinimas iš scenarijaus apimties prieš išvykstant. “ "MyVar sako $ MyVar" "
Kaip ir anksčiau, mes pradėsime nustatydami kintamąjį pasauliniame mastelyje ir baigdami tikrinant galutinį pasaulinės apimties rezultatą.
Čia galite pamatyti, kad „FunctionScope“ galėjo keisti „Script“ apimties kintamąjį ir ar pakeitimai išliko po to, kai jis buvo baigtas. Be to, kintamojo pokytis visuotinėje erdvėje išliko net ir po scenarijaus išėjimo. Tai gali būti ypač naudinga, jei turite pakartotinai keisti kintamuosius scenarijuje arba pagal pasaulinę taikymo sritį, naudodami tą patį kodą - tiesiog apibrėžiate funkciją ar scenarijų, parašytą keisti kintamąjį kur ir kaip jums reikia, ir pareikalauti, kad šie pakeitimai būtų būtini.
Kaip minėta anksčiau, tam tikros komandos gali naudoti ir apimties numerius, kad kintamasis būtų keičiamas skirtingais lygiais, palyginti su vietine apimtimi. Štai tas pats scenarijus, naudojamas antrame pirmiau pateiktame pavyzdyje, bet su funkcija, pakeista naudoti „Get-Variable“ ir „Set-Variable“ komandas, turinčias apimties numerius, o ne tiesiogiai nurodant kintamąjį su pavadinimais:
Funkcija FunctionScope "$ MyVar keitimas 0 srityje, palyginti su FunctionScope ..." Set-Variable MyVar "Tai yra MyVar funkcija 0 srityje." -Skope 0 '$ MyVar keitimas 1 taikymo srityje, palyginti su FunctionScope ...' Set-Variable „MyVar“ „MyVar“ buvo pakeista 1 taikymo sritimi iš funkcijos. “ 1-oji sritis „$ MyVar keitimas 2 apimtimi, palyginti su Functionscope ...“ „Set-Variable MyVar“ „MyVar“ buvo pakeistas 2 srities funkcija. “ 2-oji sritis „$ MyVar tikrinimas kiekvienoje taikymo srityje…“ 0 taikymo sritis: „Get-Variable MyVar -Scope 0 -ValueOlyly“ 1 taikymo sritis: „Get-Variable MyVar -Scope 1 -ValueOly 'Scope 2:„ Get-Variable MyVar “ 2 -ValueOnly "" Dabartinės $ MyVar vertės gavimas. " „MyVar sako $ MyVar“ „$ MyVar keitimas scenarijumi“. $ MyVar = 'Aš nustatiau scenarijų!' „MyVar sako $ MyVar“ „FunctionScope“ „$ MyVar“ tikrinimas iš scenarijaus apimties prieš išvykstant. “ "MyVar sako $ MyVar" "
Panašiai kaip ir anksčiau, čia matome, kaip vienos srities komandos gali keisti savo patronuojančios srities objektus.
Papildoma informacija
Yra dar daug daugiau, ką galima padaryti su apimtimis, nei gali būti pritaikytos šiame straipsnyje. Taikymo sritys veikia daugiau nei tik kintamuosius, ir dar reikia sužinoti apie privačius taikymo sritis ir „AllScope“ kintamuosius. Daugiau naudingos informacijos galite paleisti šią komandą iš „PowerShell“:
Get-Help about_scopes
Tas pats pagalbos failas taip pat prieinamas „TechNet“.
Taikymo apimties kreditas: spadassin openclipart