Kaip sritis veikia "PowerShell" scenarijus

Turinys:

Kaip sritis veikia "PowerShell" scenarijus
Kaip sritis veikia "PowerShell" scenarijus

Video: Kaip sritis veikia "PowerShell" scenarijus

Video: Kaip sritis veikia
Video: Syzygy 3's 5 Ways to Minimize Downtime - YouTube 2024, Balandis
Anonim
Paketo scenarijose aplinkos kintamųjų pakeitimai pagal numatytuosius nustatymus turi įtakos dabartiniam seanui. "PowerShell" tiksliai priešingai yra tiesa, nes taikymo sričiai naudojami scenarijaus pakeitimai izoliuoti. Čia mes išnagrinėsime, kaip galia paveikia "PowerShell" scenarijus ir kaip dirbti su jais ir aplink juos.
Paketo scenarijose aplinkos kintamųjų pakeitimai pagal numatytuosius nustatymus turi įtakos dabartiniam seanui. "PowerShell" tiksliai priešingai yra tiesa, nes taikymo sričiai naudojami scenarijaus pakeitimai izoliuoti. Čia mes išnagrinėsime, kaip galia paveikia "PowerShell" scenarijus ir kaip dirbti su jais ir aplink juos.

Kas yra taikymo sritis?

"PowerShell" "taikymo sritis" reiškia dabartinę aplinką, kurioje veikia scenarijus arba komandos apvalkalas. Taikymo sritis yra naudojamos tam tikriems aplinkos objektams apsaugoti nuo netyčinio modifikavimo scenarijais ar funkcijomis. Visų pirma, šie dalykai yra apsaugoti nuo pakeitimų komandomis paleisti iš kitos taikymo srities, jei kitose parametrose nenurodyta kitaip:

  • Kintamieji
  • Slapyvardžiai
  • Funkcijos
  • PowerShell diskai (PSDrives)

Naujos taikymo sritys sukurtos kiekvieną kartą, kai paleidžiate scenarijų arba funkciją, arba kai sukuriate naują "PowerShell" seansą ar egzempliorių. Taikymo sritis, sukurtas vykdant scenarijus ir funkcijas, turi "tėvų / vaiko" santykius su apimtimi, iš kurios jie buvo sukurti. Yra keletas sričių, turinčių ypač ypatingų reikšmių, ir jas galima rasti pagal pavadinimą:

  • The Pasaulinis taikymo sritis yra sritis, kuri yra sukurta paleidžiant "PowerShell". Tai apima kintamuosius, slapyvardžius, funkcijas ir PSDrives, kurie yra integruojami į "PowerShell", taip pat bet kuriuos, kurie yra sukurti jūsų "PowerShell" profilyje.
  • The Vietinis sritis apima bet kokią dabartinę taikymo sritį. Kai paleisite "PowerShell", tai bus nuorodos į "Global" taikymo sritį, scenarijuje bus scenarijaus taikymo sritis ir tt
  • The Scenarijus kai scenarijus paleidžiamas. Vienintelės komandos, kurios veikia pagal šią sritį, yra tos, kurios yra scenarijuje.
  • Privatus Apribojimai gali būti apibrėžti pagal dabartinę taikymo sritį, kad kitos komandos negalėtų skaityti ar keisti daiktų, kuriuos jos gali turėti prieigą.

Taikymo sritis taip pat gali būti nurodomi skaičiais tam tikrose komandose, kur dabartinė taikymo sritis vadinama nuline, o jos protėviai nurodomi didinant sveikus skaičius. Pavyzdžiui, scenarijaus, paleidžiamo iš "Global" taikymo srities, scenarijaus taikymo sritis būtų 0, o "Global" taikymo sritis būtų 1. "Scope" taikymo sritis, pvz., Funkcija, kuri toliau priskiriama sričiai, reikštų 2 Neigiami numeriai neveiks, kad pamatytų vaiko taikymo sritis - tai paaiškės netrukus.

Kaip taikymo sritis turi įtakos komandoms

Kaip minėta anksčiau, komandos, kurios vykdomos pagal vieną taikymo sritį, neturės įtakos kitai sričiai, išskyrus atvejus, kai tai konkrečiai sakoma. Pavyzdžiui, jei $ MyVar egzistuoja "Global" taikymo srityje ir scenarijus paleidžia komandą, kad $ MyVar būtų kitokio dydžio, "Global My $" versijos $ MyVar liks nepakitusi, o "MyMan" kopija bus įtraukta į scenarijaus sritį su nauja vertę. Jei $ MyVar neegzistuoja, scenarijus jį sukurs pagal scenarijaus sritį pagal numatytuosius nustatymus, o ne "Global scope". Tai svarbu prisiminti, kai sužinosite apie faktinį tėvų / vaikų santykį tarp taikymo sričių.

"PowerShell" taikymo sričių tėvų ir vaikų santykiai yra vienkartiniai. Komandos gali matyti ir, pasirinktinai, keisti dabartinę taikymo sritį, jos tėvą ir visas aukščiau esančias taikymo sritis. Tačiau jie negali matyti ar keisti dalykų bet kuriems dabartinės srities vaikams. Tai visų pirma yra ta, kad, kai jūs persikėlėte į pradinę sritį, vaiko sritis jau buvo sunaikinta, nes ji įvykdė savo tikslą. Pavyzdžiui, kodėl turėtumėte matyti arba keisti kintamąjį scenarijaus srityje iš "Global" taikymo srities, kai scenarijus baigėsi? Yra daug atvejų, kai jums reikia scenarijaus ar funkcijos pakeitimų, kurie išlieka ilgiau nei jo pabaigoje, tačiau ne tiek daug, kur reikia atlikti objekto pakeitimus scenarijaus ar funkcijos taikymo srityje prieš paleidžiant arba po jo. (Paprastai tokie dalykai vis tiek bus tvarkomi kaip scenarijaus dalis arba pati funkcija.)

Žinoma, kokios yra taisyklės be išimčių? Viena iðimtis ið anksčiau yra privataus taikymo sritis. Objektai, esantys privačiose srityse, yra prieinami tik tokioms komandoms, kurios paleidžiamos iš taikymo srities, iš kurios jos buvo sukurtos. Kitas svarbus išimtis yra elementai, turintys "AllScope" nuosavybę. Tai yra specialūs kintamieji ir slapyvardžiai, kurių bet kokio taikymo srities pasikeitimas turės įtakos visoms sritims. Šios komandos parodys jums, kurie kintamieji ir slapyvardžiai turi nuosavybės AllScope:

Get-Variable | Where-Object {$_.Options -match 'AllScope'} Get-Alias | Where-Object {$_.Options -match 'AllScope')

Taikymo sritis

Pirmą kartą ieškodami taikymo sričių mes ketiname pradėti "PowerShell" sesiją, kurioje kintamasis $ MyVar buvo nustatytas iš eilutės "Aš esu pasaulinis kintamasis!", Iš komandinės eilutės. Tada šis scenarijus bus paleistas iš failo, vadinamo 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' ''

Jei "PowerShell" scenarijai veikė taip pat, kaip ir paketiniai scenarijai, mes tikimės, kad $ MyVar (arba% MyVar% partijos sintaksėje) reikšmė pasikeis iš "Aš esu pasaulinis kintamasis!", "Aš nustatytas scenarijų!", ir pagaliau "aš nustatytas pagal funkciją!", kur jis liktų iki tol, kol jis bus aiškiai pakeistas arba sesija bus nutraukta. Tačiau pamatysite, kas iš tikrųjų atsitinka čia, kai mes judame per kiekvieną taikymo sritį - ypač po to, kai funkcija FunctionScope baigė savo darbą, ir mes vėl patikriname kintamąjį iš Script, o vėliau - Global.

Kaip matote, kintamasis pasikeitė, kai mes persikėlėme per scenarijų, nes, kol funkcija FunctionScope buvo užbaigta, mes patikrinome kintamąjį iš tos pačios taikymo srities, kuri paskutinį kartą buvo pakeista. Po to, kai "FunctionScope" buvo atliktas, mes grįžome į scenarijaus sritį, kur funkcija "$ MyVar" nepaliejo. Tada, kai scenarijus baigėsi, grįžome į pasaulinę sritį, kur ji visai nebuvo pakeista.
Kaip matote, kintamasis pasikeitė, kai mes persikėlėme per scenarijų, nes, kol funkcija FunctionScope buvo užbaigta, mes patikrinome kintamąjį iš tos pačios taikymo srities, kuri paskutinį kartą buvo pakeista. Po to, kai "FunctionScope" buvo atliktas, mes grįžome į scenarijaus sritį, kur funkcija "$ MyVar" nepaliejo. Tada, kai scenarijus baigėsi, grįžome į pasaulinę sritį, kur ji visai nebuvo pakeista.

Pasiekti už vietos ribų

Taigi, tai yra gerai ir gerai, kad padėtumėte išvengti netyčinių aplinkos pakeitimų, išskyrus scenarijus ir funkcijas, bet ką daryti, jei jūs iš tikrųjų norėtumėte atlikti tokius pakeitimus? Tai yra ypatinga ir gana paprasta sintaksė, skirta kurti ir modifikuoti objektus už Vietos taikymo srities ribų. Klaidos pavadinimo pradžioje tiesiog įveskite srities pavadinimą ir įterpkite tarpą tarp srities ir kintamųjų pavadinimų. Kaip šitas:

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

Galite naudoti šiuos modifikatorius tiek peržiūrėdami, tiek nustatydami kintamuosius. Pažiūrėkime, kas vyksta su šiuo demonstravimo scenarijumi:

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' ''

Kaip ir anksčiau, mes pradėsime nustatydami kintamąjį "Global scope" ir baigdami patikriname galutinį "Global scope" rezultatą.

Čia galite pamatyti, kad "FunctionScope" sugebėjo pakeisti kintamąjį "Scenarijaus" sritį ir kad jo pasikeitimai išliktų. Be to, pakeitimas į kintamąjį "Global" taikymo sritis išliko net po scenarijaus išėjimo. Tai gali būti ypač naudinga, jei turite pakartotinai keisti kintamuosius scenarijuje arba visuotiniame taikymo sritis, naudodami tą patį kodą. Jūs tiesiog nustatote funkciją ar scenarijų, parašytus keisti kintamąjį, kur ir kaip jums reikia. padaryta, ir pakvieskite tai, kai šie pakeitimai yra būtini.
Čia galite pamatyti, kad "FunctionScope" sugebėjo pakeisti kintamąjį "Scenarijaus" sritį ir kad jo pasikeitimai išliktų. Be to, pakeitimas į kintamąjį "Global" taikymo sritis išliko net po scenarijaus išėjimo. Tai gali būti ypač naudinga, jei turite pakartotinai keisti kintamuosius scenarijuje arba visuotiniame taikymo sritis, naudodami tą patį kodą. Jūs tiesiog nustatote funkciją ar scenarijų, parašytus keisti kintamąjį, kur ir kaip jums reikia. padaryta, ir pakvieskite tai, kai šie pakeitimai yra būtini.

Kaip minėta anksčiau, taikymo srities numeriai taip pat gali būti naudojami tam tikrose komandose, kad būtų galima keisti kintamąjį skirtingais lygmenimis, palyginti su lokalaus taikymo sritimi. Čia yra tas pats scenarijus, naudojamas antroje aukščiau pateiktame pavyzdyje, tačiau funkcija pakeista, kad būtų galima naudoti komandas "Gauti kintamasis" ir "kintamoji" su srities numeriais, o ne tiesiogiai nurodyti kintamąjį su nurodytais taikymo sritimis:

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

Panašiai kaip anksčiau, mes galime pamatyti, kaip komandos vienoje srityje gali keisti objektus savo tėvų srityje.

Papildoma informacija

Yra dar daug daugiau, ką galima padaryti su apimtimis, nei gali būti šiame straipsnyje. Taikymo sritis turi įtakos ne tik kintamiesiems, bet ir vis daugiau apie "Private scope" ir "AllScope" kintamuosius. Norėdami gauti daugiau naudingos informacijos, galite paleisti šią komandą iš "PowerShell":

Get-Help about_scopes

Tas pats pagalbos failas taip pat yra "TechNet".

Apimtis kreditinės kortelės: spadassin dėl openclipart

Rekomenduojamas: