Ako Scopes ovplyvňujú skripty PowerShell
V dávkových skriptoch má zmena premenných prostredia globálny dopad na aktuálnu reláciu predvolene. Pre PowerShell je presný opak, pretože rozsahy sa používajú na izoláciu modifikácií skriptu. Tu budeme skúmať, ako rozsahy ovplyvňujú PowerShell skripty a ako pracovať v nich a okolo nich.
Čo je rozsah?
Vo funkcii PowerShell sa "rozsah" vzťahuje na aktuálne prostredie, v ktorom je spustený skript alebo príkazový shell. Scopes sa používajú na ochranu určitých objektov v prostredí pred neúmyselnou zmenou skripty alebo funkciami. Najmä nasledujúce veci sú chránené pred zmenami pomocou príkazov spustených z iného rozsahu, pokiaľ parametre v týchto príkazoch neurčujú inak:
- premenné
- prezývky
- funkcie
- Jednotky PowerShell (PSDrives)
Nové rozsahy sú vytvorené vždy, keď spustíte skript alebo funkciu, alebo keď vytvoríte novú reláciu alebo inštanciu PowerShell. Rozsahy vytvorené spustením skriptov a funkcií majú vzťah "rodič / dieťa" s rozsahom, od ktorého boli vytvorené. Existuje niekoľko oblastí, ktoré majú obzvlášť špeciálne významy a sú dostupné podľa mena:
- globálnej rozsah je rozsah, ktorý vzniká pri spustení PowerShell. Zahŕňa premenné, aliasy, funkcie a PSDrives, ktoré sú zabudované do PowerShellu, ako aj všetky, ktoré sú vytvorené vašim profilom PowerShell.
- miestna rozsah pôsobnosti sa vzťahuje na akýkoľvek súčasný rozsah pôsobnosti. Keď spustíte PowerShell, bude sa vzťahovať na globálny rozsah, v rámci skriptu bude rozsah Skript, atď.
- skript rozsah sa vytvorí pri spustení skriptu. Jediné príkazy, ktoré fungujú v rámci tohto rozsahu, sú tie, ktoré sú v skripte.
- Súkromné rozsahy môžu byť definované v rámci súčasného rozsahu, aby sa zabránilo tomu, aby príkazy v iných oblastiach boli schopné čítať alebo upravovať položky, ktoré by inak mohli mať prístup.
Scopes možno v niektorých príkazoch označiť aj číslom, pričom súčasný rozsah sa označuje ako nula a jeho predkovia sa odvolávajú na rastúce celé čísla. Napríklad v rámci skriptu spusteného z globálneho rozsahu by rozsah skriptov bol 0 a globálny rozsah by bol 1. Rozsah, ktorý bol ďalej vnorený v rámci rozsahu skriptov, ako napríklad funkcia, by sa vzťahoval na globálny rozsah ako 2 Záporné čísla však nebudú pracovať s odkazom na detské obory - dôvody na to budú čoskoro zrejmé.
Ako Scopes ovplyvňujú príkazy
Ako už bolo spomenuté vyššie, príkazy vykonané v rámci jedného rozsahu nebudú mať vplyv na veci v inom rozsahu, pokiaľ to nepovie. Napríklad, ak $ MyVar existuje v globálnom rozsahu a skript spustí príkaz na nastavenie $ MyVar na inú hodnotu, globálna verzia $ MyVar zostane nezmenená, zatiaľ čo kópia $ MyVar je umiestnená v rámci Script s novým hodnota. Ak $ MyVar neexistuje, skript ho vytvorí v rámci rozsahu skriptov predvolene - nie v globálnom rozsahu. Je dôležité pamätať, keď sa dozviete o skutočnom vzťahu rodičov / dieťaťa medzi rozsahmi.
Vzťah medzi rodičmi a dieťaťom v systéme PowerShell je jednosmerný. Príkazy môžu vidieť a voliteľne upraviť aktuálny rozsah, jeho nadradený a všetky nadradené oblasti. Nemôžu však vidieť ani upravovať veci u žiadnych detí v súčasnom rozsahu. Je to predovšetkým preto, že keď ste sa presťahovali do rodičovského rozsahu, detský rozsah už bol zničený, pretože splnil svoj účel. Napríklad, prečo by ste museli vidieť alebo upraviť premennú v rozsahu skriptu z globálneho rozsahu po ukončení skriptu? Existuje veľa prípadov, kedy je potrebné, aby zmena skriptu alebo funkcie pretrvávala až po jej dokončení, ale nie toľko, kedy by ste mali pred alebo po spustení vykonať zmeny objektov v rámci skriptu alebo funkcie. (Zvyčajne sa takéto veci budú považovať za súčasť skriptu alebo funkcie samotnej.)
Samozrejme, aké sú pravidlá bez výnimiek? Jedna výnimka z vyššie uvedeného sú súkromné rozsahy. Objekty v súkromnom rozsahu sú prístupné iba príkazom spúšťaným v rozsahu, z ktorého boli vytvorené. Ďalšou dôležitou výnimkou sú položky, ktoré majú vlastnosť AllScope. Ide o špeciálne premenné a aliasy, pre ktoré zmena v akomkoľvek rozsahu ovplyvní všetky oblasti. Nasledujúce príkazy vám ukážu, ktoré premenné a aliasy majú vlastnosť AllScope:
Získajte premennú Kde-objekt $ _ Možnosti -match 'AllScope' Get-Alias | Kde-Objekt $ _ Možnosti -match 'AllScope')
Scopes in Action
Pri prvom pohľade na oblasti v akcii začneme v relácii PowerShell, kde je premenná $ MyVar nastavená na príkazový riadok "Ja som globálna premenná!". Potom sa zo súboru s názvom Scope-Demo.ps1 spustí nasledujúci skript:
Funkcia FunctionScope 'Zmena $ MyVar s funkciou.' $ MyVar = 'Mám nastavenú funkciu!' "MyVar hovorí $ MyVar" "Kontrola aktuálnej hodnoty $ MyVar." "MyVar hovorí $ MyVar" "Zmena $ MyVar skriptom." $ MyVar = 'Mám nastavený skript!' "MyVar hovorí $ MyVar" "FunctionScope" Kontrola konečnej hodnoty MyVar pred ukončením skriptu. " "MyVar hovorí $ MyVar" "
Ak skripty PowerShell pracovali rovnako ako dávkové skripty, očakávame, že valec $ MyVar (alebo% MyVar% v dávkovej syntaxe) sa zmení z 'Ja som globálna premenná!' Na 'Mám nastavený skript!' , a napokon na "mám nastavenú funkciu!" kde by zostal, kým sa to výslovne nezmení alebo relácia sa skončí. Pozrite sa však, čo sa tu skutočne deje, keď prechádzame cez jednotlivé oblasti - najmä potom, čo funkcia FunctionScope dokončila svoju prácu a znova kontrolujeme premennú zo skriptu a neskôr globálneho rozsahu.
Ako vidíte, zdá sa, že premenná sa zmenila, keď sme prešli cez skript, pretože až do dokončenia funkcie FunctionScope sme kontrolovali premennú z rovnakého rozsahu, ako bola naposledy zmenená. Po vykonaní FunctionScope sme sa však vrátili späť do rozsahu skriptov, kde funkcia $ MyVar zostala nedotknutá. Potom, keď bol skript ukončený, sme sa vrátili späť do globálneho rozsahu, kde to nebolo vôbec upravené.
Dosiahnutie mimo lokálneho rozsahu
Takže toto všetko je dobré a dobré, aby vám pomohlo zabrániť náhodnému použitiu zmien životného prostredia nad rámec vašich skriptov a funkcií, ale čo keď skutočne chcete vykonať takéto úpravy? Existuje špeciálna a pomerne jednoduchá syntax pre vytváranie a úpravu objektov mimo lokálneho rozsahu. Stačí zadať názov premennej na začiatok názvu premennej a umiestniť dvojbodku medzi rozsah a názvy premenných. Ako toto:
$ globálny: MyVar $ skript: MyVar $ local: MyVar
Tieto modifikátory môžete použiť aj pri prezeraní a nastavovaní premenných. Pozrime sa, čo sa stane s týmto demonštračným skriptom:
Funkcia FunctionScope "Zmena $ MyVar v lokálnom rozsahu funkcií ..." $ local: MyVar = "Toto je MyVar v lokálnom rozsahu funkcie." 'Zmena $ MyVar v rozsahu skriptu ...' $ script: MyVar = 'MyVar býval "$ global: MyVar = 'MyVar bol nastavený v globálnom rozsahu. "Kontrola $ MyVar v každom rozsahu ..." "Lokálny: $ lokálny: MyVar" "Skript: $ script: MyVar" "Globálny: $ globálny: MyVar" "" Získanie aktuálnej hodnoty $ MyVar. "MyVar hovorí $ MyVar" "Zmena $ MyVar skriptom." $ MyVar = 'Mám nastavený skript!' "MyVar hovorí $ MyVar" FunctionScope "Kontrola $ MyVar z rozsahu skriptu pred výstupom." "MyVar hovorí $ MyVar" "
Rovnako ako predtým začneme nastavením premennej v globálnom rozsahu a skončíme tým, že skontrolujeme konečný výsledok globálneho rozsahu.
Tu môžete vidieť, že funkcia FunctionScope bola schopná zmeniť premennú v rámci Scriptu a aby zmeny pretrvávali po dokončení. Tiež zmena premennej v globálnom rozsahu trvala aj po ukončení scenára. To môže byť obzvlášť užitočné, ak musíte opakovane meniť premenné v rámci skriptu alebo v rámci globálneho rozsahu pomocou rovnakého kódu - stačí definovať funkciu alebo skript, ktorý je napísaný na úpravu premennej, kde a ako to potrebujete, a kedykoľvek sú potrebné tieto zmeny.
Ako už bolo spomenuté vyššie, v niektorých príkazoch sa môžu použiť aj rozsahové čísla na zmenu premennej na rôznych úrovniach vo vzťahu k miestnemu rozsahu. Tu je ten istý skript použitý v druhom vyššie uvedenom príklade, ale funkcia bola upravená tak, aby používala príkazy Get-Variable a Set-Variable s číslami priestorov namiesto priamej referencie premennej s pomenovanými rozsahmi:
Funkcia FunctionScope "Zmena $ MyVar v rozsahu 0 v porovnaní s funkciou FunctionScope ..." Set-Variable MyVar "Toto je MyVar v rozsahu 0." -Scope 0 'Zmena $ MyVar v rozsahu 1 v pomere k FunctionScope ...' Set-Variable MyVar 'MyVar bol zmenený v rozsahu 1, z funkcie.' -Skopem 1 'Zmena $ MyVar v rozsahu 2 v porovnaní s funkciami Functionscope ...' Set-Variable MyVar 'MyVar bol zmenený z rozsahu 2 z funkcie.' -Skope 2 "Kontrola $ MyVar v každom rozsahu ..." Rozsah 0: "Get-variabilný MyVar -Scope 0 -ValueOnly" Rozsah 1: "Get-variabilný MyVar -Scope 1 -ValueOnly" Rozsah 2: "Get-variabilný MyVar-Scop 2 -ValueOnly "" Získanie aktuálnej hodnoty $ MyVar. " "MyVar hovorí $ MyVar" "Zmena $ MyVar skriptom." $ MyVar = 'Mám nastavený skript!' "MyVar hovorí $ MyVar" FunctionScope "Kontrola $ MyVar z rozsahu skriptu pred výstupom." "MyVar hovorí $ MyVar" "
Podobne ako predtým môžeme vidieť, ako príkazy v jednom rozsahu môžu meniť objekty vo svojom nadradenom rozsahu.
Ďalšie informácie
Existuje ešte oveľa viac, čo sa dá robiť s rozsahmi, než sa môžu zapadnúť do tohto článku. Scopes ovplyvňujú viac ako len premenné a je tu ešte veľa informácií o súkromných oblastiach a premenných AllScope. Viac užitočných informácií môžete spustiť z príkazu PowerShell nasledovne:
Get-Help about_scopes
Rovnaký súbor s nápovedou je k dispozícii aj v systéme TechNet.
Rozsah kreditov: spadassin na openclipart