Jak Scopes ovlivňují skripty PowerShell
V dávkových skriptech mají změny proměnných prostředí globální dopad na aktuální relaci ve výchozím nastavení. Pro PowerShell je přesný opak pravdivý, protože rozsahy se používají k oddělení změn skriptu. Zde budeme zkoumat, jak rozsahy ovlivňují PowerShell skripty a jak pracovat v nich a kolem nich.
Co je rozsah?
V "PowerShell" se "rozsah" týká aktuálního prostředí, ve kterém funguje skript nebo příkazový shell. Scopes se používají k ochraně určitých objektů v prostředí před neúmyslně upravenými skripty nebo funkcemi. Obzvláště jsou chráněny před modifikací příkazy spuštěnými z jiného oboru, pokud parametry v těchto příkazech nejsou uvedeny jinak:
- Proměnné
- Aliasy
- Funkce
- Pohony PowerShell (PSDrives)
Nové oblasti jsou vytvářeny vždy, když spustíte skript nebo funkci, nebo když vytvoříte novou relaci nebo instanci PowerShell. Rozsahy vytvořené spuštěním skriptů a funkcí mají vztah "rodič / dítě" s oblastí, ze které byly vytvořeny. Existuje několik rozsahů, které mají obzvláště zvláštní význam a lze je zpřístupnit jménem:
- The Globální rozsah je rozsah, který je vytvořen při spuštění PowerShell. Obsahuje proměnné, aliasy, funkce a PSDrives, které jsou vestavěné do PowerShellu, stejně jako všechny, které jsou vytvořeny v profilu PowerShell.
- The Místní rozsah odkazuje na jakýkoli současný rozsah působnosti. Když spustíte PowerShell, bude se vztahovat k globálnímu rozsahu, v rámci skriptu bude to rozsah Script, atd.
- The Skript rozsah je vytvořen při spuštění skriptu. Jediné příkazy, které fungují v tomto rozsahu, jsou ty, které jsou ve skriptu.
- Soukromé rozsahy rozsahu lze definovat v rámci stávajícího rozsahu, aby se zabránilo tomu, aby příkazy v jiných oblastech byly schopny číst nebo upravovat položky, které by jinak měly přístup k.
Scopes mohou být také označovány číslem v určitých příkazech, kde je aktuální rozsah označen jako nula a jeho předkové jsou odkazováni na rostoucí celá čísla. Například v rámci skriptu spuštěného z globálního oboru bude rozsah skriptu 0 a globální rozsah by byl 1. Rozsah, který byl dále vnořen v rámci rozsahu skriptu, jako je funkce, by odkazoval na globální rozsah jako 2 Negativní čísla však nebudou fungovat, pokud by odkazovaly na dětské obory - důvodem toho bude brzy zřejmé.
Jak ovlivňuje příkaz Scopes příkazy
Jak již bylo zmíněno dříve, příkazy spuštěné v jednom rozsahu nebudou mít vliv na věci v jiném rozsahu, pokud to neřeší. Například pokud $ MyVar existuje v globálním rozsahu a skript spustí příkaz nastavit $ MyVar na jinou hodnotu, globální verze $ MyVar zůstane nezměněna, zatímco kopie $ MyVar je umístěna v rozsahu skriptu s novým hodnota. Pokud $ MyVar neexistuje, skript jej ve výchozím nastavení vytvoří v rozsahu skriptů - nikoli v globálním rozsahu. Je důležité si uvědomit, jak se dozvíte o skutečném vztahu rodičů a dětí mezi obory.
Vztah mezi rodiči a dítětem v prostředí PowerShell je jednosměrný. Příkazy mohou vidět a volitelně upravovat aktuální oblast, její nadřazenou složku a všechny nadřazené oblasti. Nemohou však vidět ani měnit věci u žádného dnešního dítěte. Je to především proto, že po přesunutí do rodičovského rozsahu je podřízený rozsah již zničen, protože splnil svůj účel. Například proč byste museli zobrazit nebo upravit proměnnou v rozsahu skriptů z globálního oboru po ukončení skriptu? Existuje spousta případů, kdy potřebujete, aby změny skriptu nebo funkce trvaly po dokončení, ale ne tolik, kdy byste měli provést změny objektů v rámci skriptu nebo funkce před nebo po spuštění. (Obvykle se takové věci budou zpracovávat jako součást skriptu nebo funkce samy o sobě.)
Samozřejmě, co jsou pravidla bez výjimek? Výjimkou z výše uvedených je soukromá oblast. Objekty v oblasti soukromých oblastí jsou přístupné pouze příkazům spuštěným v rozsahu, ze kterého byly vytvořeny. Další důležitou výjimkou jsou položky, které mají vlastnost AllScope. Jedná se o speciální proměnné a aliasy, u kterých bude mít změna v jakémkoli rozsahu dopad na všechny oblasti. Následující příkazy vám ukáží, které proměnné a aliasy mají vlastnost AllScope:
Získat-variabilní | Kde-Objekt $ _ Možnosti -match 'AllScope' Get-Alias | Kde-Objekt $ _ Možnosti -match 'AllScope')
Scopes in Action
Pro náš první pohled na oblasti působnosti se chystáme začít v relaci PowerShell, kde proměnná $ MyVar byla nastavena na řetězec "Jsem globální proměnná!" Z příkazového řádku. Následující skript bude spuštěn ze souboru s názvem Scope-Demo.ps1:
Funkce FunctionScope 'Změna $ MyVar s funkcí.' $ MyVar = 'Mám nastavenou funkci!' "MyVar říká $ MyVar" "Kontrola aktuální hodnoty $ MyVar." "MyVar říká $ MyVar" "Změna $ MyVar skriptem." $ MyVar = 'Mám nastaven skript!' "MyVar říká $ MyVar" "FunctionScope" Kontrola konečné hodnoty MyVar před ukončením skriptu. " "MyVar říká $ MyVar" "
Pokud skripty PowerShell pracovaly stejně jako dávkové skripty, očekávali bychom, že valec $ MyVar (nebo% MyVar% v dávkové syntaktice) se změní z 'Jsem globální proměnná!' Na 'Mám nastaven skript!' , a konečně "jsem se dostal do funkce!" kde by zůstal, dokud nebude výslovně znovu změněn nebo ukončení relace. Zjistěte však, co se vlastně stane, když se přesučíme přes každou oblast - zejména poté, co funkce FunctionScope dokončila svou práci a zkontrolujeme proměnnou znovu ze skriptu a později globálního rozsahu.
Jak vidíte, změna se změnila, když jsme se přesunuli skriptem, protože až do dokončení funkce FunctionScope jsme kontrolovali proměnnou ze stejného oboru, který byl naposledy změněn. Po dokončení funkce FunctionScope jsme se vrátili zpět do oblasti skriptů, kde funkce $ MyVar zůstala nedotčena funkcí. Pak, když skript skončil, jsme se vrátili zpět do globálního prostoru, kde to vůbec nebylo změněno.
Dosažení mimo místní oblast
Takže je to všechno dobré a dobré, abyste vám pomohli zabránit náhodnému použití změn prostředí mimo vaše skripty a funkce, ale co když skutečně chcete provést takové úpravy? Existuje speciální a poměrně jednoduchá syntaxe pro vytváření a úpravu objektů mimo oblast Místní. Stačí zadat název oboru na začátku názvu proměnné a mezi rozsah a názvy proměnných umístit dvojtečku. Takhle:
$ globální: MyVar $ skript: MyVar $ local: MyVar
Tyto modifikátory můžete použít jak při prohlížení, tak při nastavení proměnných. Podívejme se, co se stane s tímto ukázkovým skriptem:
Funkce FunctionScope "Změna $ MyVar v místním rozsahu funkcí ..." $ local: MyVar = "Toto je MyVar v místním rozsahu funkce." 'Změna $ MyVar v rozsahu skriptu ...' $ script: MyVar = 'MyVar býval "Změna $ MyVar v globálním rozsahu ..." $ global: MyVar = 'MyVar byl nastaven v globálním rozsahu. "Kontrola $ MyVar v každém rozsahu ..." "Místní: $ lokální: MyVar" "Script: $ script: MyVar" "Globální: $ global: MyVar" " Získání aktuální hodnoty $ MyVar. "MyVar říká $ MyVar" "Změna $ MyVar skriptem." $ MyVar = 'Mám nastaven skript!' "MyVar říká, že $ MyVar" FunctionScope "Kontroluje $ MyVar z rozsahu skriptu před ukončením." "MyVar říká $ MyVar" "
Stejně jako předtím začneme nastavením proměnné v globálním rozsahu a skončíme tím, že zkontrolujeme konečný výsledek Globálního rozsahu.
Zde vidíte, že funkce FunctionScope dokázala změnit proměnnou v rozsahu skriptů a aby změny po jejím dokončení přetrvávaly. Také změna proměnné v globálním rozsahu trvala i po ukončení skriptu. To může být obzvláště užitečné, pokud musíte opakovaně měnit proměnné v rámci skriptu nebo v globálním rozsahu pomocí stejného kódu - pouze definujete funkci nebo skript, který je napsán pro úpravu proměnné, kde a jak to potřebujete, a zavolejte, kdykoli jsou tyto změny nezbytné.
Jak již bylo zmíněno výše, v některých příkazech lze také použít rozsah čísel pro změnu proměnné v různých úrovních ve vztahu k místnímu rozsahu. Zde je stejný skript použitý ve druhém výše uvedeném příkladu, ale s funkcí upravenou pro použití příkazů Get-Variable a Set-Variable s čísly rozsahu namísto přímého odkazování na proměnnou s pojmenovanými obrysy:
Funkce FunctionScope "Změna $ MyVar v rozsahu 0 vzhledem k FunctionScope ..." Set-Variable MyVar "Toto je MyVar v rozsahu 0." -Scope 0 "Změna $ MyVar v rozsahu 1 vzhledem k FunctionScope ..." Set-Variable MyVar 'MyVar byl změněn v rozsahu 1, z funkce.' -Skopem 1 'Změna $ MyVar v rozsahu 2 v porovnání s funkcí Functionscope ...' SetVariable MyVar 'MyVar byl změněn v rozsahu 2 z funkce.' -Scope 2 "Kontrola $ MyVar v každém rozsahu ..." Rozsah 0: "Get-Variable MyVar -Scope 0 -ValueOnly" Rozsah 1: "Get-variabilní MyVar -Scope 1 -ValueOnly" Rozsah 2: "Get-variabilní MyVar-Scop 2 -ValueOnly "" Získání aktuální hodnoty $ MyVar. " "MyVar říká $ MyVar" "Změna $ MyVar skriptem." $ MyVar = 'Mám nastaven skript!' "MyVar říká, že $ MyVar" FunctionScope "Kontroluje $ MyVar z rozsahu skriptu před ukončením." "MyVar říká $ MyVar" "
Stejně jako předtím můžeme vidět, jak příkazy v jednom rozsahu mohou upravovat objekty ve svém nadřazeném rozsahu.
dodatečné informace
Je ještě mnohem víc, co lze provést s rozsahy, než se může stát v tomto článku. Scopes ovlivňují více než jen proměnné a stále je ještě mnoho informací o soukromých oblastech a proměnných AllScope. Další užitečné informace můžete spustit z příkazu PowerShell následující příkaz:
Get-Help about_scopes
Stejný soubor nápovědy je k dispozici také na webu TechNet.
Rozsah obrázku kreditu: spadassin na openclipart