Koduleht » kuidas » Kuidas ulatused mõjutavad PowerShelli skripte

    Kuidas ulatused mõjutavad PowerShelli skripte

    Partii skriptides mõjutavad keskkonnamuutujate muutused vaikimisi praegust seanssi. PowerShelli puhul on täpselt vastupidine, sest skoopide muutmiseks kasutatakse skoope. Siin uurime, kuidas ulatused mõjutavad PowerShelli skripte ja kuidas neid ja nende ümber töötada.

    Mis on ulatus?

    PowerShelli puhul tähendab „ulatus” praegust keskkonda, kus töötab skript või käsklus. Reguleerimisala kasutatakse teatud objektide kaitsmiseks keskkonnas, mida skriptid või funktsioonid tahtmatult modifitseerivad. Eriti kaitstakse teisest ulatusest lähtuvate käskude abil modifitseerimise eest järgmisi asju, välja arvatud juhul, kui nendes käskudes on parameetrid teisiti määranud:

    • Muutujad
    • Varjunimed
    • Funktsioonid
    • PowerShelli seadmed (PSDrives)

    Uued rakendused luuakse iga kord, kui käivitate skripti või funktsiooni või kui loote uue seansi või PowerShelli näite. Skriptide ja funktsioonide käivitamisel loodud ulatustel on „vanem / laps” suhe selle ulatusega, kust need loodi. On mõned valdkonnad, millel on eriti eriline tähendus ja mida saab kasutada nime järgi:

    • The Globaalne ulatus on ulatus, mis luuakse PowerShelli käivitamisel. See sisaldab PowerShelli sisseehitatud muutujaid, varjunimesid, funktsioone ja PSDrive, samuti kõiki, mida teie PowerShelli profiil teeb.
    • The Kohalik reguleerimisala viitab praegusele ulatusele. Kui käivitate PowerShelli, viitab see globaalsele ulatusele, skripti piires on see skripti ulatus jne.
    • The Skript ulatus luuakse skripti käivitamisel. Ainsad käsud, mis töötavad selle ulatusega, on need, mis on skriptis.
    • Eraldi ulatust saab määratleda praeguse ulatuse piires, et vältida teiste rakenduste käskude lugemist või muutmist, mida neil muidu oleks võimalik kasutada.

    Teatud käskudes võib ka viiteid lugeda numbritega, kus praegust ulatust nimetatakse nulliks ja selle esivanemad on seotud täisarvudega. Näiteks globaalsest ulatusest lähtuva skripti piires oleks skripti ulatus 0 ja ülemaailmne ulatus 1. ulatus, mis on täiendavalt sisestatud skripti ulatusse, näiteks funktsioon, viidaks globaalsele ulatusele kui 2 Negatiivsed numbrid ei tööta lapse haarde viitamiseks, kuigi selle põhjus on varsti nähtav.

    Kuidas ulatused mõjutavad käske

    Nagu eelnevalt mainitud, ei mõjuta ühe ulatusega teostatud käsud asju teisel määral, välja arvatud juhul, kui seda konkreetselt öeldakse. Näiteks kui $ MyVar eksisteerib globaalses ulatuses ja skript käitab $ MyVari seadistamiseks erinevat väärtust, jääb $ MyVari üldversioon muutmata, kui $ MyVari koopia paigutatakse skripti ulatusse uue väärtus. Kui $ MyVar ei ole olemas, loob skript selle skripti ulatuse järgi vaikimisi - mitte globaalses ulatuses. See on oluline meeles pidada, kui sa õpid tegelike vanemate / laste suhet valdkondade vahel.

    PowerShelli ulatuste vanem / laps suhe on ühesuunaline. Käsud võivad näha ja vajadusel muuta praegust ulatust, selle vanemat ja kõiki selle ulatust. Kuid nad ei näe ega muuda asju praeguse ulatusega lastes. Põhjuseks on see, et kui olete vanemate ringi liikunud, on lapse ulatus juba hävitatud, kuna see on täitnud oma eesmärgi. Näiteks, miks peaksite pärast skripti lõpetamist nägema või muutma muutujaid skripti ulatuses, globaalsest ulatusest? Seal on palju juhtumeid, kus vajate skripti või funktsiooni muutusi, mis püsiksid pärast selle valmimist, kuid mitte nii palju, kus peate enne või pärast skripti või funktsiooni ulatust muutma objekti skripti või funktsiooni ulatuses. (Tavaliselt käsitletakse selliseid asju skripti osana või toimivad ise.)

    Muidugi, millised on eeskirjad ilma eranditeta? Üks erand ülaltoodust on erasektor. Privaatsetes rakendustes olevad objektid on ligipääsetavad ainult käskudele, mis töötavad sellises ulatuses, kust need on loodud. Teine oluline erand on üksused, millel on AllScope'i omadus. Need on erilised muutujad ja varjunimed, mille mis tahes ulatuse muutmine mõjutab kõiki valdkondi. Järgmised käsud näitavad teile, millised muutujad ja varjunimed omavad AllScope'i omadust:

    Get-Variable | Kus-objekt $ _. Valikud -märkige „AllScope” Get-Alias ​​| Kus-objekt $ _. Valikud -märkige „AllScope”)

    Rakenduste ulatus

    Meie esimese pilguga tegelemiseks alustame PowerShelli istungil, kus muutuja $ MyVar on määratud käsurealt "Ma olen globaalne muutuja!" Seejärel käivitatakse järgmine skript failist nimega Scope-Demo.ps1:

    Funktsioon FunctionScope '$ MyVari muutmine funktsiooniga.' $ MyVar = 'Ma sain funktsiooni!' "MyVar ütleb $ MyVar" "$ MyVari praeguse väärtuse kontrollimine." "MyVar ütleb $ MyVar" "$ MyVari muutmine skripti abil." $ MyVar = 'Mul on skripti poolt määratud'! "MyVar ütleb $ MyVar" "FunctionScope" MyVari lõpliku väärtuse kontrollimine enne skripti väljumist. " "MyVar ütleb $ MyVar" "

    Kui PowerShelli skriptid töötasid samamoodi nagu partiiskriptid, siis ootame, et $ MyVar'i (või% MyVar% partii süntaksis) vale muutuks "Ma olen globaalne muutuja!", "Ma sain skripti poolt!" ning lõpuks „ma sain funktsiooni!” kus see jääks, kuni see uuesti sõnaselgelt muutub või seanss lõpetatakse. Vaadake aga, mis tegelikult toimub siin, kui liigume läbi iga ulatuse - eriti pärast seda, kui funktsiooni FunctionScope funktsioon on oma töö lõpule jõudnud ja me kontrollime muutujat uuesti skriptist ja hiljem globaalsest ulatusest.

    Nagu näete, näib muutuja muutus, kui me skripti läbi liikusime, sest kuni funktsiooni FunctionScope funktsiooni lõpuleviimiseni kontrollisime muutujat sama ulatusega, mida viimati muudeti. Pärast funktsiooni FunctionScope tegemist aga kolisime tagasi skripti ulatusse, kus funktsioon ei jätnud $ MyVar'i puutumata. Siis, kui skript lõpetati, tulime tagasi globaalsesse ulatusse, kus seda üldse ei muudetud.

    Väljaspool kohalikku ulatust

    Niisiis, see on kõik hästi ja hea, et aidata teil jätta kogemata keskkonna muutusi peale skripti ja funktsioonide kasutamise, kuid mis siis, kui te tegelikult soovite selliseid muudatusi teha? Kohaliku ulatusega objektide loomiseks ja muutmiseks on olemas eriline ja üsna lihtne süntaks. Pane lihtsalt muutuja nime algusse ulatuse nimi ja asetage käärsoole ulatuse ja muutujate nimede vahele. Nagu nii:

    $ global: MyVar $ skript: MyVar $ kohalik: MyVar

    Neid modifikaatoreid saab kasutada muutujate vaatamisel ja seadistamisel. Vaatame, mis selle demonstratsiooniskriptiga juhtub:

    Funktsioon FunctionScope "$ MyVari muutmine kohaliku funktsiooni ulatuses ..." $ local: MyVar = "See on funktsiooni kohaliku ulatusega MyVar." '$ MyVari muutmine skripti ulatuses ...' $ skript: MyVar = 'MyVar oli varem Nüüd seadistage funktsioon. "$ MyVari muutmine globaalses ulatuses ..." $ global: MyVar = 'MyVar seadistati globaalses ulatuses. Nüüd seadistatakse funktsioon "$ MyVari kontrollimine igas valdkonnas ..." "Kohalik: $ local: MyVar" "Skript: $ skript: MyVar" "Globaalne: $ global: MyVar" "" $ MyVari praeguse väärtuse saamine. " "MyVar ütleb $ MyVar" "$ MyVari muutmine skripti abil." $ MyVar = 'Mul on skripti poolt määratud'! "MyVar ütleb $ MyVarile" FunctionScope "$ MyVari kontrollimine skripti ulatusest enne väljumist." "MyVar ütleb $ MyVar" "

    Nagu varemgi, alustame muutuja seadistamisest globaalses ulatuses ja lõpeb globaalse ulatuse lõpliku tulemuse kontrollimisega.

    Siin näete, et FunctionScope oli võimeline muutma skripti ulatust muutujaid ja muutusi jätkama pärast selle lõpetamist. Samuti muutus muutuja globaalses ulatuses isegi pärast skripti väljumist. See võib olla eriti kasulik juhul, kui peate korduvalt muutma skriptis või globaalses ulatuses muutujaid, kasutades sama koodi - saate lihtsalt määratleda funktsiooni või skripti, mis on kirjutatud muutuja muutmiseks, kus ja kuidas seda vajate, ja kutsuda seda alati, kui need muudatused on vajalikud.

    Nagu eelnevalt mainitud, võib teatud arvu käskude puhul kasutada ka ulatuse numbreid muutuja muutmiseks kohalikul tasandil. Siin on sama skript, mida kasutati ülaltoodud teises näites, kuid funktsiooni abil, mis on mõeldud kasutamiseks muutuva ja muutuva muutuja käskudega, mille ulatus on arv, selle asemel, et vahetult mainitud muutujaid nimetada.

    Funktsioon FunctionScope "$ MyVari muutmine vahemikus 0, võrreldes funktsiooni FunctionScope ..." Set-Variable MyVar "See on funktsiooni vahemikus 0 MyVar." -Skoobi 0 '$ MyVari muutmine 1-s vahemikus FunctionScope ...' suhtes Set-Variable MyVar 'MyVar muudeti funktsiooni 1 ulatuses.' -Skeem 1 '$ MyVari muutmine ulatus 2-s võrreldes funktsiooni Cope…' Set-Variable MyVar 'MyVar muudeti funktsiooni 2 ulatuses.' -Skoobi 2 "$ MyVari kontrollimine igas valdkonnas ..." Reguleerimisala 0: 'Get-Variable MyVar -Skoobi 0 -VäärtusKaasav' 1: 'Get-Variable MyVar -Skeem 1 -VäärtusKõik' Reguleerimisala 2: 'Muutuv MyVar 2 -ValueOnly "" $ MyVari praeguse väärtuse saamine. " "MyVar ütleb $ MyVar" "$ MyVari muutmine skripti abil." $ MyVar = 'Mul on skripti poolt määratud'! "MyVar ütleb $ MyVarile" FunctionScope "$ MyVari kontrollimine skripti ulatusest enne väljumist." "MyVar ütleb $ MyVar" "

    Sarnaselt varasemaga näeme siin, kuidas ühe ulatusega käsklused võivad muuta oma vanemate objektide objekte.

    Lisainformatsioon

    Piirangutega on veel palju rohkem, kui see artikkel sobib. Reguleerimisala mõjutab enamat kui ainult muutujaid ning erasektori ja AllScope'i muutujate kohta on veel rohkem õppida. Kasuliku teabe saamiseks saate PowerShelli kaudu käivitada järgmise käsu:

    Get-Help about_scopes

    Sama abifail on saadaval ka TechNetis.


    Kohaldamisala krediit: spadassin openclipart'is