Mājas lapa » » Kā darbības jomas ietekmē PowerShell skriptus

    Kā darbības jomas ietekmē PowerShell skriptus

    Partijas skriptos vides izmaiņu izmaiņām pēc noklusējuma ir globāla ietekme uz pašreizējo sesiju. PowerShell gadījumā tieši pretējs ir tas, ka darbības jomas tiek izmantotas, lai izolētu skripta modifikācijas. Šeit mēs izpētīsim, kā darbības jomas ietekmē PowerShell skriptus un to, kā strādāt tajos un ap tiem.

    Kas ir joma?

    Programmā PowerShell “darbības joma” attiecas uz pašreizējo vidi, kurā darbojas skripts vai komandu apvalks. Darbības jomas tiek izmantotas, lai aizsargātu noteiktus objektus vidē, lai tos nejauši mainītu skripti vai funkcijas. Īpaši sekojošas lietas tiek aizsargātas no izmaiņām, izmantojot komandas, kas darbojas no citas darbības jomas, ja vien šajās komandās nav norādīts citādi:

    • Mainīgie
    • Pseidonīmi
    • Funkcijas
    • PowerShell Drives (PSDrives)

    Jaunas darbības jomas tiek izveidotas, kad palaižat skriptu vai funkciju, vai arī, kad izveidojat jaunu sesiju vai PowerShell gadījumu. Skriptu un funkciju darbībai radītajām jomām ir “vecāku / bērnu” attiecības ar darbības jomu, no kuras tās izveidotas. Ir daži darbības virzieni, kuriem ir īpaši īpaša nozīme, un tos var piekļūt pēc nosaukuma:

    • The Globāls darbības joma ir joma, kas tiek izveidota, kad sākas PowerShell. Tas ietver mainīgos lielumus, pseidonīmi, funkcijas un PSDrive, kas ir iebūvēti PowerShell, kā arī jebkurus, ko veic jūsu PowerShell profils.
    • The Vietējais joma attiecas uz jebkādu pašreizējo darbības jomu. Startējot programmu PowerShell, tas attiecas uz globālo darbības jomu, skripta ietvaros tas būs skripta apjoms utt.
    • The Skripts darbības joma tiek veidota, kad tiek palaists skripts. Vienīgās komandas, kas darbojas šajā jomā, ir tās, kas ir skriptā.
    • Privāts darbības joma var tikt definēta pašreizējā darbības jomā, lai novērstu citu jomu komandu lasīšanu vai modificēšanu, ko tie citādi varētu piekļūt.

    Atsevišķās komandās var atsaukties arī uz skaitļiem, kur pašreizējā darbības joma tiek dēvēta par nulli, un tās priekštečiem ir atsauces, palielinot veselus skaitļus. Piemēram, skripta ietvaros, kas darbojas no globālās darbības jomas, skripta darbības joma būtu 0 un globālā darbības joma būtu 1. Darbības joma, kas tika tālāk iekļauta skripta darbības jomā, piemēram, funkcija, attiecas uz globālo darbības jomu kā 2 Negatīvie skaitļi nedarbosies, lai atsauktos uz bērnu darbības jomām, tomēr tas būs skaidrs.

    Kā darbības jomas ietekmē komandas

    Kā minēts iepriekš, komandas, kas izpildītas vienā darbības jomā, neietekmēs citas darbības jomas, ja vien tas nav īpaši norādīts. Piemēram, ja $ MyVar pastāv globālajā darbības jomā un skripts vada komandu, lai iestatītu $ MyVar citā vērtībā, $ MyVar globālā versija paliks nemainīga, kamēr $ MyVar kopija tiek ievietota skripta apjomā ar jauno vērtību. Ja $ MyVar nepastāv, skripts to izveidos Script sfērā pēc noklusējuma - nevis globālā mērogā. Tas ir svarīgi atcerēties, kad jūs uzzināsiet par faktisko vecāku / bērnu attiecību starp jomām.

    PowerShell darbības jomu vecāku / bērnu attiecības ir vienvirziena. Komandas var redzēt un pēc izvēles mainīt pašreizējo darbības jomu, tās vecāku un jebkuras virsmas virsotnes. Tomēr viņi nespēj redzēt vai pārveidot pašreizējā jomā esošos bērnus. Tas ir galvenokārt tāpēc, ka pēc tam, kad esat pārcēlies uz vecāku loku, bērna darbības joma jau ir iznīcināta, jo tā ir izpildījusi savu mērķi. Piemēram, kāpēc skripta darbības jomā pēc skripta beigām ir jāredz vai jāmaina mainīgais Script sfērā? Ir daudz gadījumu, kad jums ir nepieciešams skripta vai funkcijas izmaiņas, lai tās paliktu pēc tā pabeigšanas, bet ne tik daudz, kur nepieciešams veikt izmaiņas skripta vai funkcijas robežās pirms vai pēc tā palaišanas. (Parasti šādas lietas tiks apstrādātas kā skripta daļa vai arī tā pati darbosies.)

    Protams, kādi ir noteikumi bez izņēmumiem? Viens no iepriekš minētajiem izņēmumiem ir privātie joma. Privātajos apgabalos esošie objekti ir pieejami tikai komandām, kas darbojas tajā jomā, no kuras tās izveidotas. Vēl viens svarīgs izņēmums ir priekšmeti, kuriem ir AllScope īpašums. Tie ir īpaši mainīgie un pseidonīmi, kuru izmaiņas jebkurā jomā ietekmēs visas darbības jomas. Šādas komandas parādīs, kuri mainīgie un pseidonīmi ir AllScope rekvizīti:

    Get-Variable | Kur-Objekts $ _. Opcijas -mode “AllScope” Get-Alias ​​| Kur-Objekts $ _. Opcijas -mode “AllScope”)

    Darbības jomas

    Lai mēs pirmo reizi aplūkotu darbības jomas, mēs sākam darboties PowerShell sesijā, kurā mainītais $ MyVar ir iestatīts uz virkni, "Es esmu globāls mainīgais!", No komandrindas. Pēc tam šāds skripts tiks izpildīts no faila ar nosaukumu Scope-Demo.ps1:

    Funkcija FunctionScope 'Mainīt $ MyVar ar funkciju.' $ MyVar = 'Man ir iestatīta funkcija!' "MyVar saka $ MyVar" "$ MyVar pašreizējās vērtības pārbaude." "MyVar saka $ MyVar" "$ MyVar maiņa ar skriptu." $ MyVar = 'Man ir iestatīts skripts!' "MyVar saka $ MyVar" "FunctionScope" MyVar galīgās vērtības pārbaude pirms skripta iziešanas. " "MyVar saka $ MyVar" "

    Ja PowerShell skripti strādāja tāpat kā partijas skripti, mēs sagaidām, ka $ MyVar vale (vai% MyVar% partijas sintaksē) pāriet no "Es esmu globāls mainīgais!", Uz "Man ir iestatīts ar skriptu!" un, visbeidzot, „Es saņēmu funkciju!” kur tas paliktu, līdz tas ir skaidri mainīts vai sesija tiek pārtraukta. Tomēr skatiet to, kas patiesībā notiek šeit, kad mēs pārvietojamies pa katru jomu - jo īpaši pēc tam, kad funkcija FunctionScope ir pabeigusi savu darbu, un mēs vēlreiz pārbaudām mainīgo no skripta, bet vēlāk - globālā, darbības joma.

    Kā redzams, mainījies mainīgais, kad mēs pārvietojāmies caur skriptu, jo līdz brīdim, kad funkcija FunctionScope tika pabeigta, mēs mainījām mainīgo no tās pašas darbības jomas, kurā pēdējo reizi tika mainīts. Pēc tam, kad FunctionScope tika darīts, mēs pārvietojāmies atpakaļ uz skriptu, kur funkcija $ MyVar palika neskarta. Tad, kad skripts tika izbeigts, mēs atgriezāmies globālā mērogā, kur tas vispār nav mainīts.

    Sasniedzot ārpus vietējās darbības jomas

    Tātad, tas ir labi un labi, lai palīdzētu jums nejauši piemērot vides izmaiņas ārpus jūsu skriptiem un funkcijām, bet kas notiks, ja jūs tiešām vēlaties veikt šādas izmaiņas? Pastāv īpaša un diezgan vienkārša sintakse objektu izveidei un modificēšanai ārpus lokālās darbības jomas. Jūs vienkārši ievietojat apgabala nosaukumu mainīgā nosaukuma sākumā un ievietojiet kolu starp darbības jomu un mainīgajiem nosaukumiem. Kā šis:

    $ global: MyVar $ skripts: MyVar $ local: MyVar

    Šos modifikatorus var izmantot gan mainot, gan mainot mainīgos. Redzēsim, kas notiek ar šo demonstrācijas skriptu:

    Funkcija FunctionScope "Mainīt $ MyVar lokālajā funkcijā ..." $ local: MyVar = "Tas ir MyVar funkcijas lokālajā darbības jomā." '$ MyVar maiņa skripta darbības jomā ...' $ skripts: MyVar = 'MyVar agrāk Tagad iestatiet ar funkciju. "$ MyVar maiņa globālā mērogā ..." $ global: MyVar = 'MyVar tika iestatīts globālā mērogā. "Iestatīt $ MyVar katrā sfērā ..." "Vietējais: $ local: MyVar" "Skripts: $ skripts: MyVar" "Globāls: $ global: MyVar" "" Pašreizējās $ MyVar vērtības iegūšana. " "MyVar saka $ MyVar" "$ MyVar maiņa ar skriptu." $ MyVar = 'Man ir iestatīts skripts!' "MyVar saka $ MyVar" FunctionScope "Pārbaudīt $ MyVar no skripta darbības jomas pirms iziešanas." "MyVar saka $ MyVar" "

    Tāpat kā iepriekš, mēs sākam ar mainīgā lieluma noteikšanu globālajā darbības jomā un beidzot ar galīgā globālā darbības rezultāta pārbaudi.

    Šeit jūs varat redzēt, ka FunctionScope varēja mainīt mainīgo lielumu skripta darbības jomā, un vai izmaiņas saglabājas pēc pabeigšanas. Arī mainīgā lieluma izmaiņas globālajā jomā saglabājās pat pēc skripta iziešanas. Tas var būt īpaši noderīgi, ja jums ir atkārtoti jāmaina mainīgie lielumi skripta ietvaros vai globālā mērogā, izmantojot to pašu kodu - jūs vienkārši definējat funkciju vai skriptu, kas rakstīts, lai mainītu mainīgo, kur un kā tas ir nepieciešams, un pieprasīt, lai šīs izmaiņas būtu nepieciešamas.

    Kā minēts iepriekš, konkrētos komandos var izmantot arī darbības jomas numurus, lai mainītu mainīgo lielumu dažādos līmeņos attiecībā pret lokālo darbības jomu. Šeit ir tas pats skripts, kas izmantots otrajā piemērā, bet ar funkciju, kas pārveidota, lai izmantotu Get-Variable un Set-Variable komandas ar apjoma numuriem, nevis tieši atsauces uz mainīgo ar nosauktajām jomām:

    Funkcija FunctionScope "Mainot $ MyVar darbības sfērā 0, salīdzinot ar FunctionScope ..." Set-Variable MyVar "Tas ir MyVar funkcijas darbības sfērā 0." -Scope 0 '$ MyVar maiņa 1. darbības jomā attiecībā pret FunctionScope…' Set-Variable MyVar 'MyVar tika mainīts 1. darbības jomā no funkcijas.' -Skope 1 '$ MyVar maiņa 2. darbības jomā attiecībā pret Functionscope…' Set-Variable MyVar 'MyVar tika mainīts 2. darbības jomā no funkcijas.' 2. joma "$ MyVar pārbaude katrā sfērā ..." Darbības joma 0: 'Get-Variable MyVar -Scope 0 -ValueOlyly' Darbības joma 1: 'Get-Variable MyVar -Skope 1 -ValueOly' Scope 2: 'Get-Variable MyVar 2 -ValueOnly "" $ MyVar pašreizējās vērtības iegūšana. " "MyVar saka $ MyVar" "$ MyVar maiņa ar skriptu." $ MyVar = 'Man ir iestatīts skripts!' "MyVar saka $ MyVar" FunctionScope "Pārbaudīt $ MyVar no skripta darbības jomas pirms iziešanas." "MyVar saka $ MyVar" "

    Līdzīgi kā iepriekš, mēs varam redzēt, kā vienas darbības komandas var pārveidot objektus tās mātes jomā.

    Papildus informācija

    Joprojām ir daudz vairāk, ko var izdarīt ar jomām, kas var ietilpt šajā rakstā. Darbības joma skar vairāk nekā tikai mainīgos, un vēl ir vairāk jāapgūst par privātajiem apjomiem un AllScope mainīgajiem. Lai iegūtu vairāk noderīgas informācijas, PowerShell var palaist šādu komandu:

    Get-Help about_scopes

    Tas pats palīdzības fails ir pieejams arī programmā TechNet.


    Darbības joma kredīts: spadassin openclipart