Kā darbības jomas ietekmē PowerShell skriptus

Satura rādītājs:

Kā darbības jomas ietekmē PowerShell skriptus
Kā darbības jomas ietekmē PowerShell skriptus

Video: Kā darbības jomas ietekmē PowerShell skriptus

Video: Kā darbības jomas ietekmē PowerShell skriptus
Video: Launch SettingsActivity - Developing Android Apps - YouTube 2024, Aprīlis
Anonim
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.
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.

Kas ir darbības joma?

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:

  • Mainīgie
  • Aizstājvārdi
  • Funkcijas
  • PowerShell diski (PSDrives)

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:

  • The Globāls darbības joma ir darbības joma, kas tiek radīta, startējot PowerShell. Tajā iekļauti mainīgie, aizstājvārdi, funkcijas un PSDrives, kas ir iebūvēti PowerShell, kā arī visi, kas izveidoti ar PowerShell profilu.
  • The Vietējais darbības joma attiecas uz jebkuru pašreizējo darbības jomu. Startējot PowerShell, tas attieksies uz globālo mērogu, skriptā tas būs Script apgabals utt.
  • The Script kad darbojas skripts. Vienīgās komandas, kas darbojas šajā diapazonā, ir tās, kas atrodas skriptā.
  • Privāts darbības jomas var definēt pašreizējā darbības jomā, lai novērstu komandu izmantošanu citās jomās, lai tās varētu nolasīt vai modificēt vienumus, kuriem citādi varētu piekļūt.

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ā darbības jomas ietekmē komandas

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 | Where-Object {$_.Options -match 'AllScope'} Get-Alias | Where-Object {$_.Options -match 'AllScope')

Darbības joma

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:

Function FunctionScope { 'Changing $MyVar with a function.' $MyVar = 'I got set by a function!' 'MyVar says $MyVar' } '' 'Checking current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' '' FunctionScope '' 'Checking final value of MyVar before script exit.' 'MyVar says $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 iestatījis ar 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ā, ja tā vispār nebija mainīta.
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ā, ja tā vispār nebija mainīta.

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

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? Tiem ir īpašs un diezgan vienkāršs sintakse, lai izveidotu un modificētu objektus, kas pārsniedz vietējo 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:

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

Varat izmantot šos modifikatorus gan skatot, gan iestatot mainīgos lielumus. Apskatīsim, kas notiek ar šo demonstrācijas skriptu:

Function FunctionScope { '' 'Changing $MyVar in the local function scope…' $local:MyVar = 'This is MyVar in the function's local scope.' 'Changing $MyVar in the script scope…' $script:MyVar = 'MyVar used to be set by a script. Now set by a function.' 'Changing $MyVar in the global scope…' $global:MyVar = 'MyVar was set in the global scope. Now set by a function.' '' 'Checking $MyVar in each scope…' 'Local: $local:MyVar' 'Script: $script:MyVar' 'Global: $global:MyVar' '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Tāpat kā mēs, mēs sākam, iestatot mainīgo lielumu globālajā mērogā, un beidzot ar galīgā Global scope rezultāta pārbaudi.

Š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 izdarīt, un aiciniet to vienmēr, kad šīs izmaiņas ir nepieciešamas.
Š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 izdarīt, un aiciniet to vienmēr, kad šīs izmaiņas ir nepieciešamas.

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 komandas Get-Variable un Set-Variable ar darbības lauku numuriem, nevis tieši norādot mainīgo ar nosauktajām jomām:

Function FunctionScope { '' 'Changing $MyVar in scope 0, relative to FunctionScope…' Set-Variable MyVar 'This is MyVar in the function's scope 0.' –Scope 0 'Changing $MyVar in scope 1, relative to FunctionScope…' Set-Variable MyVar 'MyVar was changed in scope 1, from a function.' –Scope 1 'Changing $MyVar in scope 2, relative to Functionscope…' Set-Variable MyVar 'MyVar was changed in scope 2, from a function.' –Scope 2 '' 'Checking $MyVar in each scope…' ‘Scope 0:’ Get-Variable MyVar –Scope 0 –ValueOnly ‘Scope 1:’ Get-Variable MyVar –Scope 1 –ValueOnly ‘Scope 2:’ Get-Variable MyVar –Scope 2 –ValueOnly '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Image
Image

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ā.

Papildus informācija

Tur ir vēl daudz vairāk, ko var izdarīt ar jomām, kas var ietilpt šajā rakstā. Darbības jomas ietekmē vairāk nekā tikai mainīgie, un tos vēl vairāk jāiemācās par privātajām jomām un AllScope mainīgajiem. 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

Ieteicams: