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 toho, kde je lze číst a měnit. PowerShell používá pravidla oboru k zajištění toho, abyste neúmyslně nezměnili položku, která by neměla být změněna.

Toto jsou základní pravidla oboru:

  • 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ě nevytvořili jako soukromou.

  • Proměnné, aliasy, funkce a jednotky PowerShellu můžete deklarovat 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.

Pokud vytvoříte položku v oboru a položka sdílí její název s položkou v jiném oboru, původní položka může být pod novou položkou skrytá, ale nepřepíše se ani nezmění.

Obory PowerShellu

PowerShell podporuje následující 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, byly vytvořeny v globálním oboru, jako jsou automatické proměnné a proměnné předvoleb. 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 relaci.

  • 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. Pouze příkazy ve skriptu se spouštějí v oboru skriptu. Pro příkazy ve skriptu je obor skriptu místní obor.

Obory nadřazenosti a podřízenosti

Nový podřízený obor můžete vytvořit voláním skriptu nebo funkce. Obor volání je nadřazený obor. Pojmenovaný 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.

Pokud položky explicitně nesdělíte jako soukromé, budou pro podřízený obor dostupné položky v nadřazené oblasti. Položky, které vytvoříte a změníte v podřízeného oboru, ale nemají vliv na nadřazený obor, pokud při vytváření položek explicitně nezadáte obor.

Poznámka

Funkce z modulu se nespouštějí v podřízené oblasti oboru volání. Moduly mají svůj vlastní stav relace, který je propojený s globálním oborem. Veškerý kód modulu běží v hierarchii oborů specifických pro moduly, které mají vlastní kořenový obor.

Dědičnost

Podřízený obor nedědí proměnné, aliasy a funkce z nadřazeného oboru. Pokud není položka soukromá, podřízený obor může zobrazit položky v nadřazené oblasti. A může změnit položky explicitním zadáním nadřazeného oboru, ale položky nejsou součástí podřízeného oboru.

Podřízený obor se ale vytvoří se sadou položek. Obvykle zahrnuje všechny aliasy, které mají možnost AllScope . Tato možnost je popsána dále v tomto článku. Zahrnuje všechny proměnné, které mají možnost AllScope , a některé automatické proměnné.

Chcete-li najít položky v určitém oboru, použijte parametr Get-Variable Rozsah 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

Modifikátory oboru

Název proměnné, aliasu nebo funkce může obsahovat některý 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 bude viditelný pouze pro aktuální obor.

    Poznámka

    private není obor. Jedná se o možnost , která změní viditelnost položky mimo obor, ve kterém je položka definována.

  • script: – Určuje, že název existuje v oboru skriptu . Obor skriptu je obor nejbližšího 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í skriptů pomocí rutin, jako Start-Job a Invoke-Command.

  • workflow: – Určuje, že název existuje v rámci pracovního postupu. Poznámka: Pracovní postupy nejsou podporovány v PowerShellu verze 6 a novějším.

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

    Obor názvů Description
    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 funkcí a aliasů je místní obor, i když jsou definovány ve skriptu.

Použití modifikátorů oboru

Pokud chcete zadat obor 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 *

Pomocí 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 použít také k odkazech 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

Using je speciální modifikátor oboru, který identifikuje místní proměnnou ve vzdáleném příkazu. Bez modifikátoru očekává PowerShell, že proměnné ve vzdálených příkazech budou definovány ve vzdálené relaci.

Using Modifikátor oboru se zavádí v PowerShellu 3.0.

Pro jakýkoli 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 získat přístup mimo kód relace. Using Modifikátor oboru je podporován v následujících kontextech:

  • Vzdáleně spouštěné příkazy, které byly spuštěny Invoke-Command pomocí parametrů ComputerName, HostName, SSHConnection nebo Session (vzdálená relace)
  • Úlohy na pozadí, zahájené Start-Job (relace mimo proces)
  • Ú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 na něj odkazují. Ve vzdálených a zastaralých relacích jsou vždy nezávislé kopie.

Další informace najdete v tématu about_Remote_Variables.

V relacích vláken se předávají odkazem. To znamená, že je možné upravit proměnné oboru volání v jiném vlákně. K bezpečné úpravě proměnných se vyžaduje synchronizace vláken.

Další informace najdete tady:

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žené na JAZYCE XML k zpřístupnění hodnot proměnných 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 k původnímu typu. Rehydrovaný objekt je kopie původní instance objektu. Má vlastnosti a metody typu. U jednoduchých typů, jako je System.Version, je kopie přesná. U složitých typů je kopie nedostupná. Například rehydrované objekty certifikátu nezahrnují privátní klíč.

Instance všech ostatních typů jsou instance PSObject . Vlastnost PSTypeNames obsahuje původní název typu předponu 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í vlastnost AllScope , 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é 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

Chcete-li najít proměnné, 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ého oboru 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 Obor parametru .Set-Variable Následující příkaz vytvoří proměnnou v globálním oboru:

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

Můžete také použít parametr Scope parametru New-Alias, Set-Aliasnebo Get-Alias rutiny k určení oboru. 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 atd. Číslované obory jsou užitečné, pokud jste vytvořili mnoho rekurzivních oborů.

Použití zápisu zdroje Dot s oborem

Skripty a funkce dodržují všechna pravidla oboru. Vytvoříte je v určitém oboru a ovlivní jenom tento obor, pokud k změně tohoto oboru nepoužíváte parametr rutiny nebo modifikátor oboru.

Do aktuálního oboru ale můžete přidat skript nebo funkci pomocí zápisu tečky. Když se pak skript spustí v aktuálním oboru, budou všechny funkce, aliasy a proměnné, které skript vytvoří, dostupné v aktuálním oboru.

Pokud chcete přidat funkci do aktuálního oboru, zadejte tečku (.) a mezeru před cestu a název funkce ve volání funkce.

Pokud například chcete spustit skript Sample.ps1 z adresáře C:\Scripts v oboru skriptu (výchozí pro skripty), použijte následující příkaz:

c:\scripts\sample.ps1

Pokud chcete spustit skript Sample.ps1 v místním oboru, použijte následující příkaz:

. c:\scripts.sample.ps1

Při použití operátoru volání (&) ke spuštění funkce nebo skriptu se nepřidá do aktuálního oboru. Následující příklad používá operátor volání:

& c:\scripts.sample.ps1

Další informace o operátorovi volání najdete v about_operators.

Všechny aliasy, funkce nebo proměnné, které Sample.ps1 skript vytvoří, nejsou v aktuálním oboru dostupné.

Omezení bez oboru

Několik konceptů PowerShellu se podobá oboru nebo interakci s oborem. Tyto koncepty mohou být zaměňovány s oborem nebo chováním oboru.

Relace, moduly a vnořené výzvy jsou samostatná prostředí, ale nejsou podřízenými obory globálního oboru v relaci.

Relace

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

K 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ě definovány, nejsou položky v modulu přístupné mimo modul. Proto můžete modul přidat do relace a používat veřejné položky bez obav, že ostatní položky můžou přepsat rutiny, skripty, funkce a další položky ve vaší relaci.

Ve výchozím nastavení se moduly načítají do nejvyšší úrovně aktuálního stavu relace , nikoli do aktuálního oboru. Aktuální stav relace může být stav relace modulu nebo globální stav relace. Přidání modulu do relace nezmění obor. Pokud jste v globálním oboru, moduly se načtou do globálního stavu relace. Všechny exporty se umístí do globálních tabulek. Pokud načtete modul 2 z modulu1, modul2 se načte do stavu relace modulu1, nikoli do globálního stavu relace. Všechny exporty z modulu2 jsou umístěny v horní části stavu relace modulu1. Pokud použijete Import-Module -Scope local, exporty se umístí do aktuálního objektu oboru místo na nejvyšší úrovni. Pokud jste v modulu a používáte Import-Module -Scope global (nebo Import-Module -Global) k načtení jiného modulu, tento modul a jeho exporty se načtou do globálního stavu relace místo místního stavu relace modulu. Tato funkce byla navržena pro psaní modulů, které manipulují s moduly. Modul WindowsCompatibility to provede importem proxy modulů do globálního stavu relace.

V rámci stavu relace mají moduly svůj 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, dejte jí hodnotu a zavoláme funkci foo.

$a = "Goodbye"
foo

Modul deklaruje proměnnou $a v oboru modulu a pak funkce foo vypíše hodnotu proměnné v obou oborech.

$a = Hello
$global:a = Goodbye

Vnořené výzvy

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

Skripty mají vlastní obor. Pokud ladíte skript a dosáhnete zarážky ve skriptu, zadáte obor skriptu.

Privátní 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, lze zobrazit a změnit v oboru, ve kterém jsou vytvořeny, ale nelze je zobrazit nebo 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.

Parametr Option parametru New-Variable, , Set-VariableNew-Aliasa Set-Alias rutiny můžete nastavit hodnotu Option vlastnost private.

Viditelnost

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

Vlastnost Visibility přebírá Public hodnoty a Private hodnoty. Položky, které mají privátní viditelnost, lze zobrazit a změnit pouze v kontejneru, ve kterém byly vytvořeny. Pokud je kontejner přidaný nebo importovaný, položky, které mají privátní viditelnost, nelze zobrazit ani změnit.

Vzhledem k tomu, že viditelnost je určená pro kontejnery, funguje v oboru jinak.

  • Pokud vytvoříte položku, která má 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í těchto New-Variable rutin 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í rozsah.

Nejprve k zobrazení hodnoty $ConfirmPreference proměnné 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 $ConfirmPreference proměnné a potom hlásí její hodnotu v oboru skriptu. Výstup by měl vypadat podobně jako v následujícím výstupu:

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 neovlivní 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 nadřazeného oboru.

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

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 položku nechráníte 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 $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é

Privátní proměnná je proměnná, která má vlastnost Option , která má hodnotu Private. Private Proměnné jsou děděny podřízeným oborem, ale dají se zobrazit nebo změnit pouze v oboru, ve kterém byly vytvořeny.

Následující příkaz vytvoří privátní proměnnou volanou $ptest v místním oboru.

New-Variable -Name ptest -Value 1 -Option Private

Můžete zobrazit a změnit hodnotu $ptest v místním oboru.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

Dále vytvořte Sample.ps1 skript, který obsahuje následující příkazy. Příkaz se pokusí zobrazit a změnit hodnotu $ptest.

V Sample.ps1:

"The value of `$Ptest is $Ptest."
"The value of `$Ptest is $global:Ptest."

Proměnná $ptest není viditelná v oboru skriptu, výstup je prázdný.

"The value of $Ptest is ."
"The value of $Ptest is ."

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}

Obor Using byl zaveden v PowerShellu 3.0. V PowerShellu 2.0 označte, že proměnná byla vytvořena v místní relaci, použijte následující formát příkazu.

$Cred = Get-Credential
Invoke-Command $s {
  param($c)
  Remove-Item .\Test*.ps1 -Credential $c
} -ArgumentList $Cred

Viz také