Miten laajuudet vaikuttavat PowerShell-skripteihin
Eräskripteissa ympäristömuuttujien muutoksilla on oletusarvoisesti yleinen vaikutus nykyiseen istuntoon. PowerShellin kohdalla täsmälleen päinvastainen on totta, koska scopesia käytetään scriptin muutosten eristämiseen. Täällä selvitämme, miten laajuudet vaikuttavat PowerShell-skripteihin ja miten ne toimivat ja niiden ympärillä.
Mikä on laajuus?
PowerShellissa "laajuus" tarkoittaa nykyistä ympäristöä, jossa komentosarja tai komentokuorma toimii. Pinta-aloja käytetään suojaamaan tiettyjä ympäristössä olevia esineitä, joita skriptit tai toiminnot muokkaavat tahattomasti. Erityisesti seuraavat asiat suojataan muutoksilta komennoilla, jotka toimivat toisesta laajuudesta, ellei näissä komennoissa parametreilla toisin mainita:
- muuttujat
- aliakset
- tehtävät
- PowerShell-asemat (PSDrives)
Uudet alueet luodaan aina, kun suoritat komentosarjan tai toiminnon tai kun luot uuden istunnon tai PowerShell-instanssin. Skriptien ja toimintojen suorittamisella luoduilla alueilla on "vanhemman / lapsen" suhde siihen laajuuteen, josta ne on luotu. On olemassa muutamia ulottuvuuksia, joilla on erityisen erityinen merkitys, ja niitä voi käyttää nimen mukaan:
- maailmanlaajuinen soveltamisala on PowerShellin käynnistyksen yhteydessä luotu laajuus. Se sisältää PowerShelliin sisäänrakennetut muuttujat, aliakset, toiminnot ja PSDriveet sekä kaikki PowerShell-profiilisi tekemät.
- paikallinen soveltamisala tarkoittaa mitä tahansa nykyistä soveltamisalaa. Kun käynnistät PowerShellin, se viittaa maailmanlaajuiseen laajuuteen, komentosarjassa se on komentosarjan laajuus jne.
- käsikirjoitus laajuus luodaan, kun komentosarjaa käytetään. Ainoat komennot, jotka toimivat tällä alueella, ovat komentosarjassa olevia komentoja.
- yksityinen laajuudet voidaan määritellä nykyisen laajuuden rajoissa, jotta muut laajuiset komennot eivät pysty lukemaan tai muokkaamaan kohteita, joita he muuten voisivat käyttää.
Tietyt komennot voivat viitata myös lukuihin numeroilla, joissa nykyistä laajuutta kutsutaan nollaksi ja sen esivanhemmat viittaavat kasvaviin kokonaislukuihin. Esimerkiksi globaalista laajuudesta lähtevässä komentosarjassa komentosarjan laajuus olisi 0 ja globaali laajuus olisi 1. Script-soveltamisalaan edelleen sisällytetty laajuus, kuten funktio, viittaisi maailmanlaajuiseen laajuuteen 2: ksi Negatiiviset luvut eivät toimi viitaten lapsen ulottuvuuksiin, mutta syynä tähän on pian.
Miten Scopes vaikuttaa komentoihin
Kuten aiemmin mainittiin, yhden piirin sisällä suoritetut komennot eivät vaikuta asioihin toisessa laajuudessa, ellei nimenomaisesti kehota sitä tekemään. Jos esimerkiksi $ MyVar on globaalissa laajuudessa ja komentosarja suorittaa komennon asettaa $ MyVar -arvon eri arvoon, $ MyVar -palvelun yleinen versio pysyy muuttumattomana, kun $ MyVar -palvelun kopio sijoitetaan komentosarjan laajuuteen uuden arvo. Jos $ MyVaria ei ole, skripti luo sen Script-laajuuden puitteissa oletusarvoisesti - ei globaalissa laajuudessa. Tämä on tärkeää muistaa, kun opit todellisten vanhempien ja lasten suhteiden välillä.
PowerShellin toiminta-alojen vanhempien ja lasten suhde on yksisuuntainen. Komennot näkevät nykyisen laajuuden, sen vanhemman ja sen yläpuolella olevat valinnat ja mahdollisesti muokata niitä. He eivät kuitenkaan näe tai muokkaa nykyisessä laajuudessa olevia lapsia. Tämä johtuu lähinnä siitä, että kun olet siirtynyt vanhempaan laajuuteen, lapsen laajuus on jo tuhottu, koska se on täyttänyt tarkoituksensa. Esimerkiksi miksi sinun pitäisi nähdä tai muokata muuttujaa Script-laajuudessa globaalista laajuudesta sen jälkeen, kun komentosarja on päättynyt? On paljon tapauksia, joissa tarvitset komentosarjan tai toiminnon muutoksia sen päättymisen jälkeen, mutta ei niin paljon, missä sinun on tehtävä muutoksia skriptin tai toiminnon soveltamisalaan kuuluviin kohteisiin ennen tai sen jälkeen. (Yleensä tällaisia asioita käsitellään osana komentosarjaa tai ne toimivat itsessään.)
Mitkä ovat säännöt ilman poikkeuksia? Yksi poikkeus edellä mainituista on yksityiset soveltamisalat. Yksityisten laajuuksien kohteet ovat käytettävissä vain niissä käskyissä, jotka toimivat siinä laajuudessa, josta ne on luotu. Toinen tärkeä poikkeus on kohteita, joilla on AllScope-ominaisuus. Nämä ovat erityisiä muuttujia ja aliaksia, joiden muutokset vaikuttavat kaikkiin laajuuksiin. Seuraavat komennot näyttävät, millä muuttujilla ja aliaksilla on AllScope-ominaisuus:
Get-Variable | Missä -objekti $ _. Asetukset -merkki 'AllScope' Get-Alias | Missä -objekti $ _. Asetukset -näytä 'AllScope')
Toiminta-alueet
Ensimmäistä tarkastelumme toiminta-alueillamme aloitamme PowerShell-istunnossa, jossa muuttuja $ MyVar on asetettu merkkijonoon, "Olen globaali muuttuja!" Komentoriviltä. Sitten seuraava skripti ajetaan tiedostosta nimeltä Scope-Demo.ps1:
Toiminto FunctionScope '$ MyVarin muuttaminen toiminnolla.' $ MyVar = 'Olen asettanut toiminnon!' "MyVar sanoo $ MyVar" "$ MyVarin nykyisen arvon tarkistaminen." "MyVar sanoo $ MyVar" "$ MyVarin muuttaminen käsikirjoituksella." $ MyVar = 'Sain skripti!' "MyVar sanoo $ MyVar" "FunctionScope" MyVarin lopullisen arvon tarkistaminen ennen komentosarjan poistumista. " "MyVar sanoo $ MyVar" "
Jos PowerShell-skriptit toimivat samalla tavalla kuin eräskriptit, olisimme odottaneet, että $ MyVar (tai% MyVar%: n erän syntaksi) vale muuttuu "Olen globaali muuttuja!" , ja lopuksi "Minulle on asetettu toiminto!" missä se pysyy, kunnes se on nimenomaan muuttunut uudelleen tai istunto lopetetaan. Katso kuitenkin, mitä tapahtuu täällä, kun siirrymme läpi jokaisen laajuuden - erityisesti sen jälkeen, kun FunctionScope-toiminto on suorittanut työnsä ja tarkistamme muuttujan uudelleen Scriptistä ja myöhemmin Global -sovelluksesta.
Kuten näet, muuttuja näytti muuttuvan, kun siirryimme käsikirjoituksen läpi, koska funktionccope-toiminnon loppuun asti tarkistimme muuttujan samasta laajuudesta, jossa viimeksi muutettiin. Kun FunctionScope on tehty, siirryimme takaisin komentosarjan laajuuteen, jossa funktio jätti $ MyVarin koskemattomaksi. Sitten, kun skripti lopetettiin, palasimme maailmanlaajuiseen laajuuteen, jossa sitä ei ollut muutettu lainkaan.
Paikallinen ulottuvuus
Joten tämä on hyvä ja hyvä auttaa sinua jatkamaan vahingossa ympäristömuutosten tekemistä skriptien ja toimintojen ulkopuolella, mutta mitä jos haluat tehdä tällaisia muutoksia? On olemassa erityinen ja melko yksinkertainen syntaksi, jolla luodaan ja muokataan paikallisen alueen ulkopuolisia kohteita. Aseta laajuuden nimi muuttujan nimen alkuun ja aseta kaksoispiste laajuuden ja muuttujien nimien väliin. Kuten tämä:
$ global: MyVar $ script: MyVar $ local: MyVar
Näitä modifikaattoreita voi käyttää sekä muuttujia tarkasteltaessa että asetettaessa. Katsotaan, mitä tämän esittelyskriptin kanssa tapahtuu:
Toiminto FunctionScope "$ MyVarin muuttaminen paikallisessa toiminnallisessa laajuudessa ..." $ local: MyVar = "Tämä on toiminnon paikallisessa laajuudessa oleva MyVar." '$ MyVarin muuttaminen komentosarjan laajuudessa…' $ script: MyVar = 'MyVar oli aiemmin Nyt asetetaan funktiolla. "$ MyVarin muuttaminen globaalissa laajuudessa…" $ global: MyVar = 'MyVar asetettiin maailmanlaajuiseen laajuuteen. Nyt asetetaan funktio. "$ MyVarin tarkistaminen kussakin laajuudessa ..." "Paikallinen: $ local: MyVar" "Script: $ script: MyVar" "Global: $ global: MyVar" "" Nykyisen $ MyVar-arvon saaminen. " "MyVar sanoo $ MyVar" "$ MyVarin muuttaminen käsikirjoituksella." $ MyVar = 'Sain skripti!' "MyVar sanoo $ MyVar" FunctionScope 'Tarkista $ MyVar komentosarjan laajuudesta ennen poistumista.' "MyVar sanoo $ MyVar" "
Kuten aikaisemmin, aloitamme asettamalla muuttujan globaalissa laajuudessa ja päättymällä lopullisen maailmanlaajuisen laajuuden tuloksen tarkistamiseen.
Tässä näet, että FunctionScope pystyi muuttamaan muuttujaa komentosarjan laajuudessa, ja onko muutokset jatkuneet sen jälkeen, kun se oli valmis. Myös muuttuja muuttui globaalissa laajuudessa edes sen jälkeen, kun käsikirjoitus oli poistunut. Tämä voi olla erityisen hyödyllistä, jos sinun on toistuvasti vaihdettava muuttujia käsikirjoituksen sisällä tai globaalissa laajuudessa käyttäen samaa koodia - määrität vain toiminnon tai komentosarjan, joka on kirjoitettu muuttamaan muuttujaa missä ja miten tarvitset sitä, ja kehottaa aina, kun muutokset ovat tarpeen.
Kuten aikaisemmin mainittiin, laajuusmäärät voidaan myös käyttää tietyissä komennoissa muuttujan muuttamiseksi eri tasoilla suhteessa paikalliseen laajuuteen. Tässä on sama skripti, jota käytettiin yllä olevassa toisessa esimerkissä, mutta jonka funktio on muunnettu käyttämään Get-Variable- ja Set-Variable -komentoja, joilla on laajuusnumerot sen sijaan, että muuttuja olisi suoraan viitattu nimettyihin laajuuksiin:
Toiminto FunctionScope "$ MyVarin muuttaminen laajuudessa 0 suhteessa FunctionScope-ohjelmaan ..." Set-Variable MyVar "Tämä on MyVar toiminnon alueella 0." -Scope 0 '$ MyVarin muuttaminen laajuudessa 1 suhteessa FunctionScope-ohjelmaan ...' Set-Variable MyVar 'MyVar muutettiin soveltamisalalla 1 toiminnosta.' -Skooppi 1 '$ MyVarin vaihtaminen soveltamisalalla 2 suhteessa Functionscope-ohjelmaan ...' Set-Variable MyVar 'MyVar muutettiin toimialueella 2.' -Skooppi 2 "$ MyVarin tarkistaminen kussakin laajuudessa…" Soveltamisala 0: 'Get-Variable MyVar -Skope 0 -ValueOnly' Soveltamisala 1: 'Get-Variable MyVar -Skope 1 -ValueOn vain' Soveltamisala 2: 'Muuttuva MyVar -Sopeus 2 -ValueOnly "" $ MyVarin nykyisen arvon saaminen. " "MyVar sanoo $ MyVar" "$ MyVarin muuttaminen käsikirjoituksella." $ MyVar = 'Sain skripti!' "MyVar sanoo $ MyVar" FunctionScope 'Tarkista $ MyVar komentosarjan laajuudesta ennen poistumista.' "MyVar sanoo $ MyVar" "
Samoin kuin aikaisemmin, näemme tässä, kuinka yhden kappaleen komennot voivat muokata vanhemman objektin objekteja.
lisäinformaatio
Siihen voidaan vielä tehdä paljon enemmän kuin voidaan sovittaa tähän artikkeliin. Sovellukset vaikuttavat enemmän kuin vain muuttujiin, ja yksityisistä laajuuksista ja AllScope-muuttujista on vielä opittavaa. Lisää hyödyllisiä tietoja voit suorittaa seuraavan komennon PowerShellista:
Get-Help about_scopes
Sama ohjetiedosto on käytettävissä myös TechNetissä.
Scope image credit: spadassin openclipartissa