Partijas skriptos vides mainīgo mainījumos pēc noklusējuma ir vispārēja ietekme uz pašreizējo sesiju. PowerShell gadījumā tieši pretējs ir taisnība, jo skopas izmaiņas izolē, izmantojot apgabalus. Šeit mēs izpētīsim, kā darbības jomas ietekmē PowerShell skriptus un to, kā strādāt un ap tiem.
PowerShell "darbības lauks" attiecas uz pašreizējo vidi, kurā darbojas skripts vai komandu čaula. Darbības jomas tiek izmantotas, lai aizsargātu noteiktus vides objektus no nejauši izmainīta ar skriptiem vai funkcijām. Jo īpaši šādas izmaiņas tiek pasargātas no izmaiņām ar komandu palīdzību no citas darbības jomas, ja vien šajās komandās parametri nav norādīti citādi:
Jaunas darbības jomas tiek veidotas ikreiz, kad palaižat skriptu vai funkciju, vai kad izveidojat jaunu PowerShell sesiju vai eksemplāru. Darbības scenārijiem, kas izveidoti skriptu un funkciju izpildes rezultātā, ir "vecāka / bērna" attiecības ar darbības jomu, no kuras tās tika izveidotas. Pastāv vairākas darbības jomas, kurām ir īpaši īpašas nozīmes un kurām var piekļūt pēc nosaukuma:
Atsevišķās komandās var nosaukt arī darbības jomas ar numuru, kur pašreizējo darbības jomu sauc par nulli, un tā priekštečiem ir atsauce, palielinot veselus skaitļus. Piemēram, scenārijā no globālās darbības jomas skripta darbības joma būtu 0, un globālā mēroga darbības joma būtu 1. Joma, kas tika tālāk ievietota skripta apgabalā, piemēram, funkcija, attiecas uz globālo darbības jomu kā 2 Negatīvie skaitļi nestrādās, lai norādītu uz bērna darbības jomām - tā iemesls būs redzams drīzumā.
Kā minēts iepriekš, komandas, kas tiek izpildītas vienā darbības jomā, neietekmēs lietas citā darbības jomā, ja vien tas nav īpaši noteikts. Piemēram, ja $ MyVar eksistē globālā mērogā, un skripts palaiž komandu, lai iestatītu $ MyVar citai vērtībai, $ MyVar globālā versija paliks nemainīga, kamēr $ MyVar kopija tiek ievietota Script apgabalā ar jauno vērtība. Ja $ MyVar neeksistē, skripts to izveidos skripta apgabalā pēc noklusējuma - nevis globālā mērogā. Tas ir svarīgi atcerēties, kad jūs uzzināt par faktisko vecāku / bērnu attiecības starp darbības jomām.
Potenciālo vecuma / bērna attiecības PowerShell ir vienvirziena. Komandas var redzēt un, iespējams, pārveidot pašreizējo darbības jomu, tā vecāko un visas augstāk minētās darbības jomas. Tomēr viņi nevar redzēt vai mainīt lietas nevienā no pašreizējās darbības jomās esošajiem bērniem. Tas ir galvenokārt tādēļ, ka, kad esat pārvietojis vecāku darbības jomu, bērna darbības joma jau ir iznīcināta, jo tā ir izpildījusi savu mērķi. Piemēram, kāpēc jums vajadzētu redzēt vai modificēt mainīgo Script apgabalā no globālās darbības jomas, kad skripts ir izbeigts? Ir daudz gadījumu, kad jums ir nepieciešams skripta vai funkciju izmaiņas, kas saglabājas pēc tā pabeigšanas, bet ne tik daudz, kur skripta vai funkcijas darbības jomās pirms vai pēc tā veikšanas ir jāmaina objekti. (Parasti šādas lietas nekādā ziņā netiks apstrādātas kā skripta daļa vai funkcija).
Protams, kādi ir noteikumi bez izņēmumiem? Viens no iepriekš minētajiem izņēmumiem ir privātās darbības jomas. Privātās darbības jomās esošie objekti ir pieejami tikai tām komandām, kuras darbojas tā darbības jomā, no kuras tās tika izveidotas. Vēl viens svarīgs izņēmums ir priekšmeti, kuriem ir AllScope īpašums. Tie ir īpašie mainīgie lielumi un aizstājvārdi, kuru izmaiņas jebkura darbības joma ietekmēs visas darbības jomas. Šīs komandas parādīs, kuriem mainīgajiem un aizstājvārdiem ir AllScope īpašums:
Get-Variable | Kur objekts $ _. Opcijas-atbilst 'AllScope' Get-Alias | Kur objekts $ _. Opcijas-atbilst 'AllScope')
Lai vispirms aplūkotu darbības jomas, mēs sāksim darboties PowerShell sesijā, kur no komandrindas mainīgais $ MyVar ir iestatīts uz virkni "Es esmu globāls mainīgais!". Tad šāds skripts tiks palaists no faila ar nosaukumu Scope-Demo.ps1:
Funkcija FunctionScope 'Mainot $ MyVar ar funkciju.' $ MyVar = 'Man ir iestatīta funkcija!' "MyVar saka $ MyVar" "Pārbaudīt pašreizējo vērtību $ MyVar." "MyVar saka $ MyVar" "Mainot $ MyVar pēc skripta." $ MyVar = 'Man ir iestatīts skripts!' "MyVar saka $ MyVar" "FunctionScope" Pārbaudot MyVar galīgo vērtību pirms skripta izejas. " "MyVar saka $ MyVar" "
Ja PowerShell skripti darbojas tāpat kā partijas skripti, mēs sagaidām, ka $ MyVar (vai% MyVar% partijas sintaksē) vērtība mainīsies no "Es esmu globāls mainīgais!", Uz "esmu iestatījis skripts!" , un visbeidzot - "esmu uzstādījis funkciju!" kur tas paliek, kamēr tas nav skaidri mainīts vai sesija tiek pārtraukta.Tomēr, redzot to, kas patiešām notiek šeit, kad mēs pārietam pa visām jomām - jo īpaši pēc tam, kad FunctionScope funkcija ir pabeidzusi darbu, un mēs atkal pārbaudām mainīgo no Script un vēlāk globālā mēroga.
Kā redzams, mainīgais, šķiet, mainījās, jo mēs pārvietojāmies caur skriptu, jo, līdz funkcija FunctionScope tika pabeigta, mēs mainījām šo mainīgo tā paša apjoma dēļ, kas tika mainīts pēdējā laikā. Pēc tam, kad funkcija FunctionScope tika paveikta, mēs atgriezāmies skripta apgabalā, kur funkciju saglabāja $ MyVar. Pēc tam, kad skripts tika izbeigts, mēs atgriezāmies globālā mērogā, kur tā vispār nebija pārveidota.
Tātad, tas viss ir kārtībā un labi, lai palīdzētu jums netīšām piemērot izmaiņas vides jomā ārpus jūsu skriptiem un funkcijām, bet, ja jūs patiešām vēlaties veikt šādas izmaiņas? Ir īpašs un diezgan vienkāršs sintakse, lai izveidotu un modificētu objektus, kas pārsniedz lokālo apjomu. Jūs vienkārši ievietojat nosaukuma nosaukumu mainīgā nosaukuma sākumā un ievietojat kolonnu starp darbības jomu un mainīgo nosaukumiem. Kā šis:
$ globāls: MyVar $ skripts: MyVar $ vietējais: MyVar
Varat izmantot šos modifikatorus gan skatot, gan iestatot mainīgos lielumus. Apskatīsim, kas notiek ar šo demonstrācijas skriptu:
Funkcija FunctionScope "Mainīt $ MyVar lokālajā funkciju apgabalā ..." $ local: MyVar = "Tas ir MyVar funkciju lokālajā apgabalā." "Mainot $ MyVar skripta darbības jomā ..." $ script: MyVar = 'MyVar agrāk bija kas tiek iestatīts ar funkciju. "Mainīt $ MyVar pasaules mērogā ..." $ global: MyVar = 'MyVar tika iestatīts globālā mērogā. Tagad iestatīts pēc funkcijas: "Pārbaudīt $ MyVar katrā apgabalā ..." "Vietējais: $ vietējais: MyVar" "Skripts: $ script: MyVar" "Global: $ global: MyVar" "" Pašreizējās $ MyVar vērtības iegūšana ". "MyVar saka $ MyVar" "Mainot $ MyVar pēc skripta." $ MyVar = 'Man ir iestatīts skripts!' "MyVar saka $ MyVar" FunctionScope "pārbauda $ MyVar no skripta apjoma pirms izejas." "MyVar saka $ MyVar" "
Kā jau iepriekš, mēs sāksim, iestatot mainīgo lielumu globālajā mērogā, un beigsimies, pārbaudot galīgo globālā mēroga rezultātu.
Šeit jūs varat redzēt, ka FunctionScope varēja mainīt Script apgabala mainīgo lielumu un mainīt izmaiņas pēc tā pabeigšanas. Arī izmaiņa globālā mērogā mainījās, pat pēc tam, kad skripts bija izlaists. Tas var būt īpaši noderīgs, ja jums ir atkārtoti jāmaina mainīgie skriptā vai globālā mērogā, izmantojot to pašu kodu - jūs vienkārši definējat funkciju vai skriptu, kas rakstīts mainīt mainīgo, kur un kā tas nepieciešams, un kad tas nepieciešams.
Kā minēts iepriekš, darbības lauku numurus var izmantot arī atsevišķās komandās, lai mainītu mainīgo lielumu dažādos līmeņos, salīdzinot ar vietējo apjomu. Šis ir tas pats skripts, kas izmantots otrajā piemērā, bet ar funkciju, kas ir mainīta, lai izmantotu komandu Get-Variable un Set-Variable ar darbības lauka numuriem, nevis tieši norādot mainīgo ar nosauktajām jomām:
Funkcija FunctionScope "Mainīt $ MyVar apjomā 0, salīdzinot ar FunctionScope ..." Set-Variable MyVar "Tas ir MyVar funkciju apjomā 0." -Scope 0 'Mainot $ MyVar apjomā 1, salīdzinot ar FunctionScope ...' Set-Variable MyVar 'MyVar tika mainīts 1. darbības jomā, no funkcijas.' -Scope 1 'Mainot $ MyVar apjomā 2, salīdzinot ar Functionscope ...' Set-Variable MyVar 'MyVar tika mainīts darbības jomā 2, no funkcijas.' -Scope 2 "Pārbaudīt $ MyVar katrā darbības jomā ..." Darbības joma 0: "Get-Variable MyVar -Scope 0 -ValueOnly" Darbības joma 1: "Get-Variable MyVar-Scope 1 -Value Only" Darbības joma 2: "Get-Variable MyVar-Scope 2 -ValueOnly ")" Pašreizējās $ MyVar vērtības iegūšana. " "MyVar saka $ MyVar" "Mainot $ MyVar pēc skripta." $ MyVar = 'Man ir iestatīts skripts!' "MyVar saka $ MyVar" FunctionScope "pārbauda $ MyVar no skripta apjoma pirms izejas." "MyVar saka $ MyVar" "
Līdzīgi kā agrāk, mēs varam redzēt, kā komandas vienā darbības jomā var modificēt objektus tā vecāka mērogā.
Joprojām ir daudz vairāk, ko var izdarīt ar jomām, nekā šajā rakstā var ietilpt. Darbības jomas ietekmē vairāk nekā tikai mainīgie, un par privātajām jomām un AllScope mainīgajiem vēl daudz jāapzinās. Lai iegūtu vairāk noderīgas informācijas, no PowerShell var palaist šādu komandu:
Get-Help about_scopes
Tas pats palīdzības fails ir pieejams arī TechNet.
Darbības joma attēla kredīts: spadassin par openclipart