Sdílet prostřednictvím


about_Scopes

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

Když spustíte PowerShell, hostitel (pwsh.exe) vytvoří prostředí Runspace PowerShellu. Hostitelské procesy můžou mít více prostředí runspace. Každý runspace má vlastní kontejnery stavu relace a oboru. Ke stavu relace a oborům není možné přistupovat 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, který byl vytvořen, a v jakýchkoli podřízených oborech, pokud ji explicitně nevytvořili jako soukromou.
  • 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á sdílí její název s položkou v jiném oboru, může být původní položka skrytá novou položkou, ale nepřepíše se ani nezmění.

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.

Při vytvoření podřízeného oboru 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ě nesdělíte jako soukromé, budou položky v nadřazené oblasti k dispozici pro podřízený obor. Položky, které vytvoříte nebo změníte v podřízené oblasti, 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 nebo Get-Variable 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 nadřazené oblasti soukromá, bude hledání pokračovat v řetězu oborů. Příklad 4 ukazuje účinek privátní proměnné v hledání oboru.

Názvy oborů PowerShellu

PowerShell definuje názvy pro některé obory, aby bylo možné k ho 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ý nadřazený obor v prostředí runspace.
  • Místní: Aktuální obor. Místním oborem může být globální obor nebo jakýkoli jiný obor.
  • Skript: Obor, 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 obor skriptu místní obor.

U rutin, které podporují obory, lze obory odkazovat číslem, které popisuje relativní pozici jednoho oboru k 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 místním oboru. Aktuální obor je vždy místní obor.

  • private: – Určuje, že název je soukromý a viditelný pouze pro aktuální obor.

    Poznámka:

    private: není obor. Je to 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 . Obor skriptu je nejbližší obor nadřazeného souboru skriptu nebo globální , pokud neexistuje nejbližší nadřazený soubor skriptu.

  • using: – Používá se pro přístup 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 rámci pracovního postupu. Poznámka: Pracovní postupy nejsou podporované v PowerShellu v6 a vyšších verzích.

  • <variable-namespace> – Modifikátor vytvořený poskytovatelem PowerShellu PSDrive . Příklad:

    Obor názvů 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 nebo 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í Viditelnost 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 *

Použití modifikátoru private oboru 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 script: modifikátor oboru:

$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 odkaz 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

using: Modifikátor oboru

Použití je speciální modifikátor oboru, který identifikuje místní 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 using oboru se zavádí v PowerShellu 3.0.

Pro každý skript nebo příkaz, který se spustí mimo relaci, potřebujete using modifikátor oboru pro vložení hodnot proměnných z oboru volající relace, aby k nim mohl přistupovat kód mimo relaci. using Modifikátor oboru je podporován v následujících kontextech:

  • Vzdáleně spouštěné příkazy, spuštěné Invoke-Command pomocí parametrů ComputerName, HostName, SSHConnection nebo Session (vzdálená relace)
  • Úlohy na pozadí, spuštěné s Start-Job (mimo procesovou relací)
  • Úlohy vláken, spuštěné prostřednictvím Start-ThreadJob nebo ForEach-Object -Parallel (samostatná relace vlákna)

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 zastaralých relacích jsou vždy nezávislé kopie.

Další informace najdete v tématu about_Remote_Variables.

$using: Odkaz se rozšíří jenom 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 Kolekce bezpečné pro přístup z více vláken.

Serializace hodnot proměnných

Vzdálené spouštění příkazů a úloh na pozadí dochází 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 OBJEKT PSObject , který obsahuje původní objekty vlastnosti, ale ne jeho metody.

Pro omezenou sadu typů deserializace rehydruje objekty zpět do původního typu. Rehydrovaný objekt je kopie původní instance objektu. 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 dosazované objekty certifikátu nezahrnují privátní 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ě zděděny nadřazenými obory.

Položka, která má AllScope vlastnost je viditelná v podřízené 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.

Správa oboru

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 rutiny 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 Scope parametr .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 získá proměnné, které jsou viditelné v místním oboru:

Get-Variable -Scope local

Chcete-li vytvořit proměnnou v určitém oboru, použijte modifikátor oboru nebo parametr Scope parametru Set-Variable. Následující příkaz vytvoří proměnnou v globálním oboru:

New-Variable -Scope global -Name a -Value "One"

K určení oboru můžete použít také parametr Scope parametru New-Alias, Set-Aliasnebo Get-Alias rutiny. Následující příkaz vytvoří alias v globálním oboru:

New-Alias -Scope global -Name np -Value Notepad.exe

Pokud chcete získat funkce v určitém oboru, použijte rutinu Get-Item , když jste v oboru. Rutina Get-Item nemá parametr Scope .

Poznámka:

U rutin, 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. Obor 1 označuje okamžitý nadřazený obor. 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 oborem

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.

Obsah skriptu nebo funkce ale můžete přidat do aktuálního oboru pomocí zápisu tečk-source. Když spustíte skript nebo funkci pomocí zápisu typu tečk-source, spustí se v aktuálním oboru. Všechny funkce, aliasy a proměnné ve skriptu nebo funkci se přidají do aktuálního oboru.

Pokud chcete například spustit Sample.ps1 skript z C:\Scripts adresáře v oboru skriptu (výchozí hodnota pro skripty), stačí zadat úplnou cestu k souboru skriptu na příkazovém řádku.

c:\scripts\sample.ps1

Aby byl soubor skriptu spustitelný, musí mít příponu .ps1 souboru. Soubory, které mají v cestě mezery, musí být uzavřeny v uvozovkách. Pokud se pokusíte spustit cestu v uvozování, PowerShell místo spuštění skriptu zobrazí obsah uvozového řetězce. 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 oboru skriptu. Použití operátoru volání se neliší od spuštění skriptu podle názvu.

& c:\scripts\sample.ps1

Další informace o operátoru volání najdete v about_Operators.

Sample.ps1 Spuštění skriptu 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 oboru 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é oboru a můžou pracovat s obory. 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.

Přednášky

Relace 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. Relace začíná vlastním globálním oborem. 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 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 oboru modulu a funkce pak v obou oborech vypíše hodnotu proměnné.

$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 modul 2 z modulu 1, modul2 se načte do kontejneru oboru modulu 1. Všechny exporty z modulu 2 jsou umístěny v aktuálním rozsahu modulu Modulu1. 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 do globálního stavu relace.

Vnořené výzvy

Vnořené výzvy nemají vlastní obor. Když zadáte vnořenou výzvu, vnořená výzva je podmnožinou prostředí. Ale zůstanete v místním rozsahu.

Skripty mají vlastní obor. Pokud ladíte skript a dostanete se do zarážky ve skriptu, zadáte obor skriptu.

Soukromá možnost

Aliasy a proměnné mají vlastnost Option , která může převzít hodnotu Private. Položky, které mají Private tuto možnost, 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á soukromou možnost v globálním oboru a pak spustíte skript, Get-Variable příkazy ve skriptu nezobrazí privátní proměnnou. Použití modifikátoru globálního oboru v této instanci nezobrazuje privátní proměnnou.

Pomocí parametru Option parametru New-Variable, , Set-VariableNew-Aliasa Set-Alias rutiny nastavit hodnotu Option vlastnost Private.

Viditelnost

Vlastnost Visibility proměnné nebo aliasu určuje, zda lze zobrazit položku mimo kontejner, ve kterém byla vytvořena. Kontejner může být modul, skript nebo modul snap-in. Viditelnost je určená pro kontejnery stejným způsobem jako Private hodnota vlastnosti Option určená pro obory.

Vlastnost Visibility přebírá Public hodnoty a Private hodnoty. 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.

Protože viditelnost je určená pro kontejnery, funguje v oboru 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 rutin můžete vytvořit proměnnou, která má privátní viditelnost.

Příklady

Příklad 1: Změna hodnoty proměnné pouze ve skriptu

Následující příkaz změní hodnotu $ConfirmPreference proměnné ve skriptu. Změna nemá vliv na globální obor.

Nejprve k zobrazení hodnoty $ConfirmPreference proměnné v místním oboru použijte následující příkaz:

PS>  $ConfirmPreference
High

Vytvořte skript Scope.ps1, který obsahuje následující příkazy:

$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."

Spusťte skript. Skript změní hodnotu $ConfirmPreference proměnné a potom nahlá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 $ConfirmPreference proměnné 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 $test proměnné.

V Sample.ps1:

$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."

Při spuštění Sample.ps1by se měl výstup podobat následujícímu výstupu:

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 skript Sample.ps1, který definuje proměnnou $test . Ve skriptu použijte modifikátor oboru, který odkazuje na globální nebo místní verze $test proměnné.

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 private: oboru 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 ScopeExample.ps1 skript vytvoří pět funkcí. První funkce volá další funkci, která vytvoří podřízený obor. 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 privátní proměnná je viditelná pouze v funcBoboru, 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 ShowScopesz , 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 using modifikátor oboru. 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 pak ji použije $Cred ve vzdáleném příkazu:

$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $using:Cred}

Modifikátor using oboru byl zaveden v PowerShellu 3.0.

Viz také