Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Vysvětluje koncept oboru v PowerShellu a ukazuje, jak nastavit a změnit rozsah prvků.
Dlouhý popis
PowerShell chrání přístup k proměnným, aliasům, funkcím a jednotkám PowerShellu (PSDrives) omezením, kde se dají číst a měnit. PowerShell používá pravidla oboru, abyste zajistili, že nechtěně nezměníte položky v jiných oborech.
Pravidla oboru
Při spuštění PowerShellu vytvoří hostitel (pwsh.exe) běhový prostor PowerShellu.
Hostitelské procesy mohou mít více výpočetních prostředí „runspace“. Každý runspace má vlastní kontejnery stavu relace a oboru. Není možné přistupovat ke stavu relace a oborům napříč instancemi runspace.
Toto jsou základní pravidla rozsahu:
- Obory můžou vnořit. Vnější obor se označuje jako nadřazený obor. Všechny vnořené obory jsou podřízené obory nadřazeného objektu.
- Položka je viditelná v oboru, ve kterém byla vytvořena, a v jakýchkoli podřízených oborech, pokud ji explicitně nenastavíte jako soukromou.
- Pomocí modifikátorů oboru můžete deklarovat proměnné, aliasy, funkce a jednotky PowerShellu pro obor mimo aktuální obor.
- Položku, kterou jste vytvořili v rámci oboru, lze změnit pouze v oboru, ve kterém byla vytvořena, pokud explicitně nezadáte jiný obor.
- Když kód spuštěný v prostředí Runspace odkazuje na položku, PowerShell prohledá hierarchii oboru, počínaje aktuálním oborem a pokračuje v jednotlivých nadřazených oborech.
- Pokud položku nenajdete, vytvoří se nová položka v aktuálním oboru.
- Pokud najde shodu, načte se hodnota položky z oboru, kde byla nalezena.
- Pokud hodnotu změníte, položka se zkopíruje do aktuálního oboru, aby změna ovlivnila pouze aktuální obor.
- Pokud explicitně vytvoříte položku, která má stejný název jako položka v jiném rozsahu, původní položka může být skryta novou položkou, ale není přepsána ani změněna.
Obory nadřazenosti a podřízenosti
Nový podřízený obor můžete vytvořit voláním skriptu nebo funkce. Volající obor je nadřazený obor. Volaný skript nebo funkce je podřízený obor. Funkce nebo skripty, které voláte, mohou volat jiné funkce a vytvářet hierarchii podřízených oborů, jejichž kořenový obor je globální obor.
Poznámka
Funkce z modulu se nespouštějí v podřízené oblasti volajícího oboru. Moduly mají vlastní stav relace, který je propojený s oborem, ve kterém byl modul importován. Veškerý kód modulu běží v hierarchii oborů, které mají vlastní kořenový obor. Další informace najdete v části Moduly tohoto článku.
Když se vytvoří podřízený obor, zahrnuje všechny aliasy a proměnné, které mají možnost AllScope, a některé automatické proměnné. Tato možnost je popsána dále v tomto článku.
Pokud položky explicitně nenastavíte jako soukromé, budou položky v nadřazeném oboru k dispozici v podřízeném oboru. Položky, které vytvoříte nebo změníte v podřízeném oboru, nemají vliv na nadřazený obor, pokud při vytváření položek explicitně nezadáte obor.
Chcete-li najít položky v určitém oboru, použijte parametr Scope Get-Variable nebo Get-Alias.
Pokud chcete například získat všechny proměnné v místním oboru, zadejte:
Get-Variable -Scope Local
Pokud chcete získat všechny proměnné v globálním oboru, zadejte:
Get-Variable -Scope Global
Pokud je odkaz na proměnnou, alias nebo funkci, PowerShell prohledá aktuální obor. Pokud se položka nenajde, vyhledá se nadřazený obor. Toto hledání se opakuje až do globálního oboru. Pokud je proměnná v předcházejícím oboru soukromá, bude hledání pokračovat přes řetězec oborů. Příklad 4 ukazuje efekt privátní proměnné ve vyhledávání oboru.
Názvy oborů PowerShellu
PowerShell definuje názvy pro některé obory, aby k nim bylo možné lépe přistupovat. PowerShell definuje následující pojmenované obory:
- globální: Obor, který se projeví při spuštění PowerShellu nebo při vytváření nové relace nebo prostředí Runspace. Proměnné a funkce, které jsou přítomné při spuštění PowerShellu, jako jsou automatické proměnné a proměnné předvoleb, se vytvářejí v globálním oboru. Proměnné, aliasy a funkce v profilech PowerShellu se také vytvářejí v globálním oboru. Globální obor je kořenovým nadřazeným oborem v rámci runspace.
- Místní: Aktuální rozsah. Místním oborem může být globální obor nebo jakýkoli jiný obor.
- skript: Rozsah, který se vytvoří při spuštění souboru skriptu. Příkazy ve skriptu se spouštějí v oboru skriptu. Pro příkazy ve skriptu je skriptový obor místním oborem.
U cmdletů, které podporují obory, lze obory označovat číslem, které udává relativní pozici jednoho vůči druhému. Obor 0 označuje aktuální (místní) obor, obor 1 je nadřazený obor aktuálního oboru, obor 2 je prarodič aktuálního oboru. Tento vzor bude pokračovat, dokud nedosáhnete kořenového oboru.
Modifikátory oboru
Název proměnné, aliasu nebo funkce může obsahovat libovolný z následujících volitelných modifikátorů oboru:
Global:– Určuje, že název existuje v globálním oboru.Local:– Určuje, že název existuje v oboru Místní. Aktuální rozsah je vždy místní rozsah. Pokud použijeteLocal:modifikátor oboru, PowerShell nevyhledává nadřazené obory. Pokud položka existuje v aktuálním oboru, použije se. Pokud položka v aktuálním oboru neexistuje, PowerShell vytvoří novou položku v aktuálním oboru.Private:– Určuje, že název je soukromý a je viditelný pouze pro aktuální oblast.Poznámka
Private:není rozsah. Jedná se o možnost, která změní přístupnost položky mimo obor, ve kterém je definovaná.Script:– Určuje, že název existuje v oboru Skriptu. Rozsah skriptu je rozsah nejbližšího nadřazeného souboru skriptu nebo Globální, pokud neexistuje nejbližší nadřazený soubor skriptu.Using:– slouží k přístupu k proměnným definovaným v jiném oboru při spouštění ve vzdálených relacích, úlohách na pozadí nebo úlohách vlákna.Workflow:– Určuje, že název existuje v pracovním postupu. Poznámka: Pracovní postupy nejsou podporované v PowerShellu v6 a vyšších verzích.<variable-namespace>– modifikátor vytvořený poskytovatelem PSDrive v PowerShellu. Například:Namespace Popis Alias:Aliasy definované v aktuálním oboru Env:Proměnné prostředí definované v aktuálním oboru Function:Funkce definované v aktuálním oboru Variable:Proměnné definované v aktuálním oboru
Výchozí obor pro skripty je obor skriptu. Výchozí obor pro funkce a aliasy je místní obor, i když jsou definované ve skriptu.
Použití modifikátorů oboru
Pokud chcete určit rozsah nové proměnné, aliasu nebo funkce, použijte modifikátor oboru.
Syntaxe modifikátoru oboru v proměnné je:
$[<scope-modifier>:]<name> = <value>
Syntaxe modifikátoru oboru ve funkci je:
function [<scope-modifier>:]<name> {<function-body>}
Následující příkaz, který nepoužívá modifikátor oboru, vytvoří proměnnou v aktuálním oboru, nebo v místním oboru :
$a = "one"
Pokud chcete vytvořit stejnou proměnnou v globálním oboru, použijte modifikátor oboru Global::
$Global:a = "one"
Get-Variable a | Format-List *
Všimněte si hodnot vlastností viditelnosti a možnosti.
Name : a
Description :
Value : one
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
Porovnejte ji s privátní proměnnou:
$Private:pVar = 'Private variable'
Get-Variable pVar | Format-List *
Pomocí modifikátoru oboru Private: nastaví vlastnost Options na Private.
Name : pVar
Description :
Value : Private variable
Visibility : Public
Module :
ModuleName :
Options : Private
Attributes : {}
Pokud chcete vytvořit stejnou proměnnou v oboru skriptu, použijte modifikátor oboru Script::
$Script:a = "one"
Můžete také použít modifikátor oboru s funkcemi. Následující definice funkce vytvoří funkci v globálním oboru :
function Global:Hello {
Write-Host "Hello, World"
}
Modifikátory oboru můžete také použít k odkazu na proměnnou v jiném oboru.
Následující příkaz odkazuje na proměnnou $test, nejprve v místním oboru a potom v globálním oboru:
$test
$Global:test
Modifikátor oboru Using:
"Using je speciální modifikátor oblasti, který identifikuje lokální proměnnou ve vzdáleném příkazu." Bez modifikátoru PowerShell očekává definování proměnných ve vzdálených příkazech ve vzdálené relaci.
Modifikátor oboru Using: byl zaveden v PowerShellu 3.0.
Pro každý skript nebo příkaz, který se spustí mimo relaci, potřebujete modifikátor oboru Using: pro vložení hodnot proměnných z oboru volající relace, aby k nim byl přístup mimo kód relace. Modifikátor oboru Using: je podporován v následujících kontextech:
- Vzdáleně spouštěné příkazy, spuštěné s
Invoke-Commandpomocí ComputerName, HostName, SSHConnection nebo Relace (vzdálená relace) - Úlohy na pozadí, spuštěné s
Start-Job(session mimo proces) - Úlohy vláken, spuštěné prostřednictvím
Start-ThreadJobneboForEach-Object -Parallel(samostatná relace vláken)
V závislosti na kontextu jsou vložené hodnoty proměnných buď nezávislé kopie dat v oboru volajícího, nebo odkazy na ni. Ve vzdálených a mimo proces relacích jsou vždy nezávislé kopie.
Další informace naleznete v dokumentaci about_Remote_Variables.
Odkaz $Using: se rozšíří pouze na hodnotu proměnné. Pokud chcete změnit hodnotu proměnné v oboru volajícího, musíte mít odkaz na samotnou proměnnou. Odkaz na proměnnou můžete vytvořit získáním instance PSVariable proměnné. Následující příklad ukazuje, jak vytvořit odkaz a provést změny v úloze vlákna.
$Count = 1
$refOfCount = Get-Variable Count
Start-ThreadJob {
($Using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob
$Count
2
Poznámka
Nejedná se o operaci bezpečnou pro přístup z více vláken. Poškození dat můžete způsobit, když se pokusíte změnit hodnotu z více vláken současně. K ochraně sdílených dat byste měli použít datové typy bezpečné pro přístup z více vláken nebo primitiv synchronizace. Další informace naleznete v tématu Thread-Safe kolekce.
Serializace hodnot proměnných
Příkazy prováděné na dálku a úlohy na pozadí běží mimo proces. Relace mimo proces používají serializaci a deserializaci založenou na jazyce XML, aby byly hodnoty proměnných dostupné napříč hranicemi procesu. Proces serializace převede objekty na PSObject, který obsahuje původní vlastnosti objektů, ale ne jejich metody.
Pro omezenou sadu typů deserializace rehydruje objekty zpět do původního typu. Rehydrovaný objekt je kopie původní instance objektu. Tento objekt má vlastnosti a metody typu. U jednoduchých typů, například System.Version, je kopie přesná. U složitých typů je kopie neúplná. Například rehydratované objekty certifikátu nezahrnují soukromý klíč.
Instance všech ostatních typů jsou instance PSObject. Vlastnost pstypenames obsahuje původní název typu s předponou Deserialized, například Deserialized.System.Data.DataTable
Možnost AllScope
Proměnné a aliasy mají vlastnost Option, která může mít hodnotu AllScope. Položky, které mají AllScope vlastnost se stanou součástí všech podřízených oborů, které vytvoříte, i když nejsou zpětně děděny nadřazenými obory.
Položka, která má vlastnost AllScope, je viditelná v podřízeném oboru a je součástí tohoto oboru. Změny položky v libovolném oboru ovlivňují všechny obory, ve kterých je proměnná definována.
Řízení rozsahu
Několik rutin má parametr Scope, který umožňuje získat nebo nastavit (vytvořit a změnit) položky v určitém oboru. Pomocí následujícího příkazu vyhledejte všechny cmdlety ve vaší relaci, které mají parametr Scope:
Get-Help * -Parameter Scope
K vyhledání proměnných, které jsou viditelné v určitém oboru, použijte parametr Scope v Get-Variable. Viditelné proměnné zahrnují globální proměnné, proměnné v nadřazené oblasti a proměnné v aktuálním oboru.
Například následující příkaz vybere proměnné, které jsou viditelné v místním rozsahu:
Get-Variable -Scope Local
Chcete-li vytvořit proměnnou ve specifickém rozsahu, použijte modifikátor rozsahu nebo parametr ScopeSet-Variable. Následující příkaz vytvoří proměnnou v globálním rozsahu:
New-Variable -Scope Global -Name a -Value "One"
Můžete také použít parametr Scope aplety New-Alias, Set-Aliasnebo Get-Alias k určení oboru. Následující příkaz vytvoří alias v globálním rozsahu:
New-Alias -Scope Global -Name np -Value Notepad.exe
Pokud chcete získat funkce ve specifickém oboru, použijte cmdlet Get-Item, když jste v tomto oboru. Cmdlet Get-Item nemá parametr rozsahu .
Poznámka
Pro cmdlety, které používají parametr Scope, můžete také odkazovat na obory podle čísla. Číslo popisuje relativní pozici jednoho oboru k druhému. Obor 0 představuje aktuální nebo místní obor. Oblast 1 označuje nejbližší nadřazenou oblast. Obor 2 označuje nadřazený obor nadřazeného oboru atd. Číslované obory jsou užitečné, pokud jste vytvořili mnoho rekurzivních oborů.
Použití zápisu dot-source s rozsahem
Skripty a funkce se řídí pravidly oboru. Vytvoříte je v určitém oboru a ovlivní pouze tento obor, pokud k změně tohoto oboru nepoužijete parametr rutiny nebo modifikátor oboru.
Ale můžete přidat obsah skriptu nebo funkce do aktuálního oboru pomocí zápisu dot-source. Když spustíte skript nebo funkci pomocí zápisu typu dot-source, spustí se v aktuálním kontextu. Všechny funkce, aliasy a proměnné ve skriptu nebo funkci se přidají do aktuálního oboru.
Pokud chcete například spustit skript Sample.ps1 z adresáře C:\Scripts v oboru skriptu (výchozí hodnota pro skripty), stačí na příkazovém řádku zadat úplnou cestu k souboru skriptu.
C:\scripts\sample.ps1
Aby byl soubor skriptu spustitelný, musí mít příponu souboru .ps1. Soubory, které mají v cestě mezery, musí být uzavřeny v uvozovkách. Pokud se pokusíte spustit cestu v uvozovkách, PowerShell zobrazí obsah uvedeného řetězce místo spuštění skriptu. Operátor volání (&) umožňuje spustit obsah řetězce obsahujícího název souboru.
Pomocí operátoru volání spustíte funkci nebo skript v rámci skriptu. Použití operátoru příkazu se neliší od spuštění skriptu jmenovitě.
& C:\scripts\sample.ps1
Další informace o operátoru volání najdete v about_Operators.
Pokud chcete spustit skript Sample.ps1 v místním oboru, zadejte tečku a mezeru (. ) před cestou ke skriptu:
. C:\scripts\sample.ps1
Nyní se do aktuálního rozsahu přidají všechny funkce, aliasy nebo proměnné definované ve skriptu.
Omezení bez oboru
PowerShell obsahuje některé možnosti a funkce, které jsou podobné rozsahu a mohou interagovat s rozsahy. Tato funkce může být zaměňována s oborem nebo chováním oboru.
Relace, moduly a vnořené výzvy jsou samostatná prostředí, nikoli podřízené obory globálního oboru v relaci.
Zasedání
Sezení je prostředí, ve kterém běží PowerShell. Když vytvoříte relaci na vzdáleném počítači, PowerShell vytvoří trvalé připojení ke vzdálenému počítači. Trvalé připojení umožňuje použít relaci pro více souvisejících příkazů.
Vzhledem k tomu, že relace je obsažené prostředí, má vlastní obor, ale relace není podřízeným oborem relace, ve které byla vytvořena. Sezení začíná svým vlastním globálním rozsahem. Tento obor je nezávislý na globálním rozsahu relace. V relaci můžete vytvořit podřízené obory. Můžete například spustit skript pro vytvoření podřízeného oboru v relaci.
Moduly
Ke sdílení a doručování nástrojů PowerShellu můžete použít modul PowerShellu. Modul je jednotka, která může obsahovat rutiny, skripty, funkce, proměnné, aliasy a další užitečné položky. Pokud nejsou explicitně exportovány (pomocí Export-ModuleMember nebo manifestu modulu), nejsou položky v modulu přístupné mimo modul. Proto můžete modul přidat do relace a používat veřejné položky, aniž byste se museli obávat, že ostatní položky mohou přepsat rutiny, skripty, funkce a další položky ve vaší relaci.
Moduly se standardně načítají do kořenového (globálního) oboru runspace. Import modulu nezmění obor.
Moduly v rámci relace mají vlastní obor. Zvažte následující modul C:\temp\mod1.psm1:
$a = "Hello"
function foo {
"`$a = $a"
"`$Global:a = $Global:a"
}
Teď vytvoříme globální proměnnou $a, dáme jí hodnotu a zavoláme funkci foo.
$a = "Goodbye"
foo
Modul deklaruje proměnnou $a v rámci modulu a poté funkce foo vykonává výstup hodnoty této proměnné v obou oblastech.
$a = Hello
$Global:a = Goodbye
Moduly vytvářejí kontejnery paralelního oboru propojené s oborem, ve kterém byly importovány. Položky exportované modulem jsou k dispozici od úrovně oboru, ve které se importují. Položky, které nejsou exportovány z modulu, jsou k dispozici pouze v kontejneru oboru modulu. Funkce v modulu mají přístup k položkám v oboru, ve kterém byly importovány, a také k položkám v kontejneru oboru modulu.
Pokud načtete Module2 z vModule1, Module2 se načte do kontejneru oboru modulu 1. Všechny exporty z module2 jsou umístěny v aktuálním rozsahu modulu Module1. Pokud použijete Import-Module -Scope Local, exporty se umístí do aktuálního objektu oboru, nikoli na nejvyšší úrovni. Pokud jste v modulu a načtete jiný modul pomocí Import-Module -Scope Global (nebo Import-Module -Global), tento modul a jeho exporty se načtou do globálního oboru místo místního oboru modulu.
Funkce WindowsCompatibility provede import modulů proxy serveru do globálního stavu relace.
Vnořené výzvy
Vnořené výzvy nemají vlastní rozsah. Když zadáte vnořenou výzvu, vnořená výzva je podmnožinou prostředí. Ale zůstáváte v rámci místního rozsahu.
Skripty mají vlastní rozsah. Pokud ladíte skript a dostanete se do zarážky v kódu, vstoupíte do rozsahu skriptu.
Soukromá možnost
Aliasy a proměnné mají vlastnost Option, která může mít hodnotu Private. Položky, které mají možnost Private, se dají zobrazit a změnit v oboru, ve kterém jsou vytvořené, ale nedají se zobrazit ani změnit mimo tento obor.
Pokud například vytvoříte proměnnou, která má privátní nastavení v globálním oboru, a poté spustíte skript, příkazy Get-Variable ve skriptu nezobrazí tuto privátní proměnnou. Použití modifikátoru oboru Global: v této instanci nezobrazuje privátní proměnnou.
Můžete použít parametr Option u rutin New-Variable, Set-Variable, New-Aliasa Set-Alias pro nastavení hodnoty vlastnosti Option na Private.
Viditelnost
Vlastnost Visibility proměnné nebo aliasu určuje, jestli se položka zobrazí mimo kontejner, ve kterém byla vytvořena. Kontejner může být modul, skript nebo modul snap-in. Viditelnost je navržena pro kontejnery stejným způsobem, jako je hodnota Private vlastnosti Option navržena pro obory.
Vlastnost Visibility přebírá hodnoty Public a Private. Položky, které mají privátní viditelnost, je možné zobrazit a změnit pouze v kontejneru, ve kterém byly vytvořeny. Pokud je kontejner přidaný nebo importovaný, položky s privátní viditelností se nedají zobrazit ani změnit.
Viditelnost je určena pro kontejnery, proto funguje v rozsahu jinak.
- Pokud vytvoříte položku s privátní viditelností v globálním oboru, nemůžete položku zobrazit ani změnit v žádném oboru.
- Pokud se pokusíte zobrazit nebo změnit hodnotu proměnné, která má privátní viditelnost, PowerShell vrátí chybovou zprávu.
Pomocí rutin New-Variable a Set-Variable můžete vytvořit proměnnou s privátní viditelností.
Examples
Příklad 1: Změna hodnoty proměnné pouze ve skriptu
Následující příkaz změní hodnotu proměnné $ConfirmPreference ve skriptu. Změna nemá vliv na globální obor.
Nejprve k zobrazení hodnoty proměnné $ConfirmPreference v místním oboru použijte následující příkaz:
PS> $ConfirmPreference
High
Vytvořte Scope.ps1 skript, který obsahuje následující příkazy:
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
Spusťte skript. Skript změní hodnotu proměnné $ConfirmPreference a potom hlásí její hodnotu v oboru skriptu. Výstup by měl vypadat přibližně takto:
The value of $ConfirmPreference is Low.
Dále otestujte aktuální hodnotu proměnné $ConfirmPreference v aktuálním oboru.
PS> $ConfirmPreference
High
Tento příklad ukazuje, že změny hodnoty proměnné v oboru skriptu neovlivňují hodnotu proměnné v nadřazené oblasti.
Příklad 2: Zobrazení hodnoty proměnné v různých oborech
Modifikátory oboru můžete použít k zobrazení hodnoty proměnné v místním oboru a v nadřazené oblasti.
Nejprve definujte proměnnou $test v globálním oboru.
$test = "Global"
Dále vytvořte Sample.ps1 skript, který definuje proměnnou $test. Ve skriptu použijte modifikátor oboru, který odkazuje na globální nebo místní verze proměnné $test.
V Sample.ps1:
$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $Global:test."
Když spustíte Sample.ps1, měl by výstup vypadat přibližně takto:
The local value of $test is Local.
The global value of $test is Global.
Po dokončení skriptu je v relaci definována pouze globální hodnota $test.
PS> $test
Global
Příklad 3: Změna hodnoty proměnné v nadřazené oblasti
Pokud nechráníte položku pomocí možnosti Private nebo jiné metody, můžete zobrazit a změnit hodnotu proměnné v nadřazené oblasti.
Nejprve definujte proměnnou $test v globálním oboru.
$test = "Global"
Dále vytvořte Sample.ps1 skript, který definuje proměnnou $test. Ve skriptu použijte modifikátor oboru, který odkazuje na globální nebo místní verze proměnné $test.
V Sample.ps1:
$Global:test = "Local"
"The global value of `$test is $Global:test."
Po dokončení skriptu se změní globální hodnota $test.
PS> $test
Local
Příklad 4: Vytvoření privátní proměnné
Proměnnou lze nastavit jako soukromou pomocí modifikátoru oboru Private: nebo vytvořením proměnné s vlastností Option nastavenou na Private. Soukromé proměnné lze zobrazit nebo změnit pouze v oboru, ve kterém byly vytvořeny.
V tomto příkladu vytvoří skript ScopeExample.ps1 pět funkcí. První funkce volá následující funkci, která vytvoří podřízený rozsah. Jedna z funkcí má privátní proměnnou, která se dá zobrazit pouze v oboru, ve kterém byla vytvořena.
PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
"Setting `$funcAVar1 to 'Value set in funcA'"
$funcAVar1 = "Value set in funcA"
funcB
}
function funcB {
"In funcB before set -> '$funcAVar1'"
$Private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
"In funcB after set -> '$funcAVar1'"
funcC
}
function funcC {
"In funcC before set -> '$funcAVar1' - should be the value set in funcA"
$funcAVar1 = "Value set in funcC - Child scopes can see this change."
"In funcC after set -> '$funcAVar1'"
funcD
}
function funcD {
"In funcD before set -> '$funcAVar1' - should be the value from funcC."
$funcAVar1 = "Value set in funcD"
"In funcD after set -> '$funcAVar1'"
'-------------------'
ShowScopes
}
function ShowScopes {
$funcAVar1 = "Value set in ShowScopes"
"Scope [0] (local) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
"Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
"Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
"Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
"Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1
Výstup zobrazuje hodnotu proměnné v každém oboru. Vidíte, že soukromá proměnná je viditelná pouze v funcB, tedy v rámci, ve kterém byla vytvořena.
Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set -> 'Value set in funcD'
-------------------
Scope [0] (local) $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'
Jak je znázorněno výstupem z ShowScopes, můžete přistupovat k proměnným z jiných oborů pomocí Get-Variable a zadat číslo oboru.
Příklad 5: Použití místní proměnné ve vzdáleném příkazu
Pro proměnné ve vzdáleném příkazu vytvořeném v místní relaci použijte modifikátor oboru Using:. PowerShell předpokládá, že proměnné ve vzdálených příkazech byly vytvořeny ve vzdálené relaci.
Syntaxe je:
$Using:<VariableName>
Například následující příkazy vytvoří proměnnou $Cred v místní relaci a použijí proměnnou $Cred ve vzdáleném příkazu:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}
Modifikátor oboru Using: byl zaveden v PowerShellu 3.0.