If-Koubou

Miten Scopes vaikuttaa PowerShell-skripteihin

Miten Scopes vaikuttaa PowerShell-skripteihin (Miten)

Eräkäsikirjoissa muutokset ympäristömuuttujiin vaikuttavat yleisesti nykyiseen istuntoon oletuksena. PowerShellille päinvastoin tämä pätee, koska skoptien avulla erotetaan skriptin muutokset. Tässä selvitämme, miten käyttöalueet vaikuttavat PowerShell-komentosarjoihin ja miten työskennellä niiden ympärillä.

Mikä on soveltamisala?

PowerShellissä "soveltamisala" viittaa nykyiseen ympäristöön, jossa komentosarja tai komento-kuori toimii. Sovelluksia käytetään tiettyjen ympäristöön kohdistuvien kohteiden suojaamiseen skriptit tai toiminnot tahattomasti muokkaaviksi. Erityisesti seuraavat asiat on suojattu muokkaamalla toisista ulottuvuuksista ajavia komentoja, ellei näiden komentojen parametrien toisin mainita:

  • muuttujat
  • aliakset
  • tehtävät
  • PowerShell-asemat (PSDrives)

Uusia alueita luodaan aina, kun suoritat komentosarjan tai toiminnon tai kun luot uuden PowerShell-istunnon tai -esitteen. Scriptsin ja toimintojen avulla luodut laajuudet ovat "vanhempi / lapsi" -suhde niiden laajuuden kanssa, josta ne luotiin. On olemassa muutamia alueita, joilla on erityisiä merkityksiä, ja joita voi käyttää nimillä:

  • maailmanlaajuinen Laajuus on soveltamisala, joka luodaan, kun PowerShell käynnistyy. Se sisältää PowerShellille sisäänrakennetut muuttujat, aliakset, toiminnot ja PSDrives sekä PowerShell-profiilisi.
  • paikallinen soveltamisala tarkoittaa mitä tahansa nykyistä soveltamisalaa. Kun käynnistät PowerShellin, se viittaa Globaaliin soveltamisalaan, komentosarjassa se on Script-ala, jne.
  • käsikirjoitus Sovellusalue luodaan, kun komentosarja ajetaan. Ainoat komennot, jotka toimivat tässä soveltamisalueessa ovat niitä, jotka ovat käsikirjoituksessa.
  • yksityinen kentät voidaan määritellä nykyisessä soveltamisalueessa, jotta estettäisiin muilta alueilta tulevat komennot pystyvät lukemaan tai muokkaamaan kohteita, joihin heillä muuten olisi pääsy.

Sovelluksia voidaan myös kutsua numerolla tietyissä komennoissa, joissa nykyistä soveltamisalaa kutsutaan nollaksi ja sen esi-isiin viitataan kasvavilla kokonaislukuilla. Esimerkiksi Globaalin soveltamisalan käsikirjoituksen sisällä Script-laajuus olisi 0 ja Globaali soveltamisala olisi 1. Script-laajuuden sisäpuolella oleva lisäosa, kuten funktio, viittaisi Globaaliin soveltamisalaan 2 Negatiiviset numerot eivät toimi viittaamaan lapsialueisiin - syy tähän on ilmeinen lähiaikoina.

Miten laajuudet vaikuttavat komentoihin

Kuten aiemmin mainittiin, yhden alueen sisällä toteutetut komennot eivät vaikuta asioihin toisella alueella, ellei nimenomaisesti sanota niin. Esimerkiksi jos $ MyVar on olemassa Globaali-alueella ja komentosarja käskee komennon asettamaan $ MyVar -arvon toiseen arvoon, Global-versio $ MyVar pysyy muuttumattomana, kun $ MyVar -kopio sijoitetaan Script-laajuuteen uudella arvo. Jos $ MyVar ei ole olemassa, komentosarja luo sen Script-alueelle oletusarvoisesti - ei Globaalissa. Tämä on tärkeää muistaa, kun opit todellisen vanhemman / lapsen suhteesta laajuusalueiden välillä.

PowerShellin pääalueiden vanhemman / lapsen suhde on yksisuuntainen. Komennot voivat nähdä ja valinnaisesti muokata nykyistä soveltamisalaa, sen emoa ja mitä tahansa edellä mainittuja ulottuvuuksia. He eivät kuitenkaan näe tai muokkaa asioita missään tämänhetkisessä lapsessa. Tämä johtuu ennen kaikkea siitä, että kun olet muuttanut vanhemman laajuuden, lapsen laajuus on jo tuhottu, koska se on täyttänyt tavoitteensa. Esimerkiksi, miksi sinun pitäisi nähdä vai muokata muuttujaa Script-laajuudelta Global-laajuudesta, kun komentosarja on päättynyt? Runsaasti tapauksia, joissa tarvitset komentosarjan tai toimintojen muutoksia, pysyvät sen jälkeenkin loppuun asti, mutta ei niin paljon, missä sinun pitäisi tehdä muutoksia käsikirjoituksen tai toimintojen piirissä oleviin kohteisiin ennen tai jälkeen sen suorittamista. (Yleensä tällaisia ​​asioita käsitellään käsikirjoituksen tai toiminnon osana.)

Tietenkin, mitkä ovat sääntöjä ilman poikkeuksia? Yhtenä poikkeuksena edellä ovat yksityiset tavoitteet. Yksittäisten kohteiden objektit ovat käytettävissä vain niillä käskyillä, joita ne luotiin. Toinen tärkeä poikkeus on kohteet, joilla on AllScope-ominaisuus. Nämä ovat erityisiä muuttujia ja aliaksia, joiden muutokset vaikuttavat kaikkiin soveltamisalueisiin. Seuraavat komennot näyttävät, mitkä muuttujat ja aliakset ovat AllScope-ominaisuus:

Get-muuttuja | Missä-Objekti $ _. Vaihtoehdot -match 'AllScope' Get-Alias ​​| Missä-Objekti $ _. Asetukset -match "AllScope")

Laajuus toiminnassa

Ensin tarkastelemme toiminta-aloja, aloitamme PowerShell-istunnossa, jossa muuttujan $ MyVar on asetettu merkkijonoksi, 'Olen maailmanlaajuinen muuttuja!', Komentoriviltä. Sitten seuraava skripti ajetaan tiedostosta nimeltä Scope-Demo.ps1:

Toiminto FunctionScope 'Muuttuu $ MyVar funktiolla.' $ MyVar = 'Minulla on toiminto!' "MyVar sanoo $ MyVar" "" $ MyVarin nykyisen arvon tarkistaminen. " "MyVar sanoo $ MyVar" "Muuttuu $ MyVar scriptin mukaan." $ MyVar = 'Sain käsikirjoituksen!' "MyVar sanoo $ MyVar" "FunctionScope" MyVarin lopullisen arvon tarkistamisen ennen komentoriviltä poistumista. " "MyVar sanoo $ MyVar" "

Jos PowerShell-komentosarjat toimivat samoin kuin komentosarjat, odotamme, että $ MyVar (tai% MyVar% erässyntaksissa) arvo muuttuu "Olen globaali muuttuja!", "Sain käsikirjoituksen!" , ja lopulta "Sain käyttöön tehtävän!" jossa se pysyisi, kunnes se muuttuu nimenomaan uudelleen tai istunto keskeytetään.Katso, mitä tosiasiassa tapahtuu, kun siirrymme jokaisen ulottuvuuden läpi - varsinkin kun FunctionScope-funktio on suorittanut työnsä ja tarkistamme muuttujan uudelleen Scriptistä ja myöhemmin Globaalista.

Kuten näet, muuttujat näyttävät muuttuvan, kun muutimme komentosarjan läpi, koska Funktion toiminto loppui, kunnes tarkistimme muuttujan samasta soveltamisalueesta, että sitä muutettiin viimein. Kun FunctionScope kuitenkin oli tehty, siirsimme takaisin Script-alueelle, jossa toiminto ei koskettanut $ MyVar -ohjelmaa. Sitten, kun käsikirjoitus lopetettiin, palasimme takaisin Globaaliin soveltamisalaan, jossa sitä ei ole lainkaan muutettu.

Tavoitteen saavuttaminen paikallisen soveltamisalan ulkopuolella

Joten tämä on hyvä ja hyvä auttaa sinua pitämään tahattomasti muutoksia ympäristöön skriptiesi ja toimintojen ulkopuolella, mutta mitä jos todella haluat tehdä tällaisia ​​muutoksia? On olemassa erityinen ja melko yksinkertainen syntaksi luomaan ja muokkaamaan esineitä Paikallinen soveltamisalaa pitemmälle. Laita vain soveltamisnimi muuttujan nimen alkuun ja laita kaksoispiste sovellusalueen ja muuttujan nimien väliin. Kuten tämä:

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

Voit käyttää näitä modifioijia sekä muuttujien katseluun ja määrittämiseen. Katsotaan, mitä tapahtuu tämän esittelysekriptin kanssa:

Toiminto FunctionScope "Muuttuu $ MyVar paikallisen toiminnon laajuusalueella ..." $ local: MyVar = "Tämä on MyVar toiminnon paikallisessa laajuudessa." "$ MyVarin muuttaminen käsikirjapiirissä ..." $ script: MyVar = 'MyVar käytti olla "MyVar: n muuttaminen globaalissa ympäristössä ... '$ global: MyVar =' MyVar määritettiin globaalissa soveltamisalueessa. Nykyinen arvo on $ MyVar. "" Paikallinen: $ local: MyVar "" Script: $ script: MyVar "" Global: $ global: MyVar "" "MyVar sanoo $ MyVar" "Muuttuu $ MyVar scriptin mukaan." $ MyVar = 'Sain käsikirjoituksen!' "MyVar sanoo $ MyVar" FunctionScope "tarkistaa $ MyVar: n kirjoitusalueesta ennen poistumista." "MyVar sanoo $ MyVar" "

Kuten aiemmin, aloitamme määrittämällä muuttujan Globaali-alueelle ja lopetamme viimeisen Globaalin laajuuden tuloksen tarkistamisen.

Tässä näet, että FunctionScope pystyi vaihtamaan muuttujan Script-laajuuteen ja muutokset jatkuvat sen jälkeen, kun se on suoritettu. Myös muuttujan muuttuminen Globaalissa laajuudessa jatkui, vaikka käsikirjoitus olisi poistunut. Tämä voi olla erityisen hyödyllinen, jos haluat vaihtaa muuttujia toistuvasti komentosarjan sisällä tai Globaalin laajuuden sisällä käyttäen samaa koodia - määrität vain sellaisen toiminnon tai komentosarjan, joka on kirjoitettu muuttamaan muuttujaa, missä ja miten sitä tarvitaan, ja soita, kun muutokset ovat välttämättömiä.

Kuten aiemmin mainittiin, soveltamisnumeroita voidaan käyttää myös tietyissä komennoissa muuttamaan muuttujaa eri tasoilla suhteessa paikalliseen soveltamisalaan. Tässä on sama skripti, jota käytetään toisessa esimerkissä yllä, mutta funktiolla, joka on muunnettu käyttämään Get-Variable- ja Set-Variable -komentoja, joilla on soveltamisnumerot, eikä suoraan viittaamaan muuttujaa,

Toiminto FunctionScope "Muuttujan $ MyVar: n soveltamisala 0, suhteessa FunctionScope ..." Set-Variable MyVar "Tämä on MyVar toiminnon laajuudessa 0." -Scope 0 "$ MyVar: n muuttaminen soveltamisalueelle 1, suhteessa FunctionScope ..." Set-Variable MyVar "MyVar-toimintoa vaihdettiin soveltamisalueella 1, funktiosta." -Scope 1 'Muuttaminen $ MyVar -alueelle 2, suhteessa Functionscope ...' Set-Variable MyVar 'MyVar muutettiin soveltamisalueella 2 funktiosta.' -Scope 2: "MyVarin tarkistaminen jokaisessa soveltamisalassa ..." Soveltamisala 0: "Get-Variable MyVar -Scope 0 -ValueOnly" Soveltamisala 1: "Get-Variable MyVar -Scope 1 -ValueOnly" Soveltamisala 2: Get-Variable MyVar -Scope 2 -ValueOnly "" Nykyisen arvon hankkiminen $ MyVar. " "MyVar sanoo $ MyVar" "Muuttuu $ MyVar scriptin mukaan." $ MyVar = 'Sain käsikirjoituksen!' "MyVar sanoo $ MyVar" FunctionScope "tarkistaa $ MyVar: n kirjoitusalueesta ennen poistumista." "MyVar sanoo $ MyVar" "

Kuten edelläkin, voimme nähdä tältä, miten komennot yhdessä laajuudessa voivat muokata esineitä sen emoalueella.

lisäinformaatio

Siellä on vielä paljon enemmän, mitä voidaan tehdä osien kanssa, kuin ne sopivat tähän artikkeliin. Sovellukset vaikuttavat enemmän kuin vain muuttujia, ja yksityiskohtia ja AllScope-muuttujia on vielä enemmän. Lisätietoja hyödyllisistä tiedoista voit suorittaa seuraavan komennon PowerShellissä:

Get-Help about_scopes

Samaa ohjetiedostoa on saatavilla myös TechNet-palvelimella.

Laajuus kuva luotto: spadassin on openclipart