about_Scopes

Stručný 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) tím, že omezuje jejich čtení a změny. PowerShell používá pravidla oboru k zajištění toho, abyste neúmyslně nezměnili položku, která by se neměla měnit.

Toto jsou základní pravidla oboru:

  • Obory se můžou vnořit. Vnější obor se označuje jako nadřazený obor. Všechny vnořené obory jsou podřízené obory tohoto nadřazeného objektu.

  • Položka je viditelná v oboru, ve kterém byla vytvořena, a ve všech podřízených oborech, pokud ji explicitně nenasadíte jako soukromou.

  • Pro obor mimo aktuální obor můžete deklarovat proměnné, aliasy, funkce a jednotky PowerShellu.

  • 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 použije při spuštění PowerShellu nebo při vytvoření nové relace nebo runspace. Proměnné a funkce, které existují při spuštění PowerShellu, se vytvořily v globálním oboru, například automatické proměnné a proměnné předvoleb. Proměnné, aliasy a funkce ve vašich 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. V oboru skriptu se spouští pouze příkazy ve skriptu. Pro příkazy ve skriptu je oborem skriptu místní obor.

Nadřazené a podřízené obory

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 tak hierarchii podřízených oborů, jejichž kořenovým oborem je globální obor.

Pokud explicitně nenasadíte položky jako soukromé, budou položky v nadřazeného oboru k dispozici pro podřízený obor. Položky, které vytvoříte a změníte v podřízené oblasti, však nebudou mít vliv na nadřazený obor, pokud explicitně nezadáte obor při vytváření položek.

Poznámka

Funkce z modulu se nespouštějí v podřízené oblasti volajícího oboru. 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 modul, která má vlastní kořenový obor.

Dědičnost

Podřízený obor nedědí proměnné, aliasy a funkce z nadřazeného oboru. Pokud položka není soukromá, podřízený obor může zobrazit položky v nadřazené oblasti. A může změnit položky explicitním určení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ěkolik automatických proměnných.

Pokud chcete najít položky v určitém oboru, použijte parametr Scope pro Get-Variable nebo Get-Alias.

Pokud například chcete 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 oboru Local . Aktuální obor je vždy místní obor.

  • private: – Určuje, že název je Privátní a 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 definovaná.

  • 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 žádný soubor skriptu nejbližšího nadřazeného skriptu.

  • using: – Používá se pro přístup k proměnným definovaným v jiném oboru při spouštění skriptů prostřednictvím rutin jako Start-Job a Invoke-Command.

  • workflow: – Určuje, že název existuje v rámci pracovního postupu. Poznámka: V PowerShellu v6 a novějších verzích se pracovní postupy nepodporují.

  • <variable-namespace> – Modifikátor vytvořený zprostředkovatelem PowerShell 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ím oborem funkcí a aliasů je místní obor, a to i v případě, že jsou definované 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í Visibility (Viditelnost ) a Options (Možnosti ).

Name        : a
Description :
Value       : one
Visibility  : Public
Module      :
ModuleName  :
Options     : None
Attributes  : {}

Porovnejte to s privátní proměnnou:

$private:pVar = 'Private variable'
Get-Variable pVar | Format-List *

Pomocí modifikátoru private oboru se vlastnost Options nastaví 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"

U funkcí můžete také použít modifikátor oboru. Následující definice funkce vytvoří funkci v globálním oboru:

function global:Hello {
  Write-Host "Hello, World"
}

Pomocí modifikátorů oboru můžete také odkazovat na proměnnou v jiném oboru. Následující příkaz odkazuje na proměnnou $test , nejprve v místním oboru a pak v globálním oboru:

$test
$global:test

Modifikátor Using: 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á, že proměnné ve vzdálených příkazech budou definovány ve vzdálené relaci.

Modifikátor Using oboru je zavedený 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. Modifikátor Using oboru se podporuje v následujících kontextech:

  • Vzdáleně spouštěné příkazy, které začínají Invoke-Command pomocí parametrů ComputerName, HostName, SSHConnection nebo Session (vzdálená relace)
  • Úlohy na pozadí, spuštěné s 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 hodnoty vložených proměnných buď nezávislé kopie dat v oboru volajícího, nebo odkazy na tato data. Ve vzdálených a mimoprocesových relacích se vždy jedná o 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 proměnné oboru volání je možné upravit v jiném vlákně. Bezpečné úpravy proměnných vyžadují synchronizaci vláken.

Další informace najdete tady:

Serializace hodnot proměnných

Vzdáleně spouštěné příkazy a úlohy na pozadí jsou mimo proces. Relace mimo proces používají serializaci založenou na jazyce XML a deserializaci, aby byly hodnoty proměnných dostupné napříč hranicemi procesu. Proces serializace převádí objekty psObject , který obsahuje původní objekty vlastnosti, ale ne jeho metody.

U omezené sady typů deserializace rehydruje objekty zpět na původní typ. 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 objekty rehydrovaných certifikátů neobsahují 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 převzí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ě zděděny nadřazenými obory.

Položka, která má vlastnost AllScope , je viditelná v podřízeného oboru a je součástí tohoto oboru. Změny položky v libovolném oboru mají vliv na 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 v 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. Mezi viditelné proměnné patří 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

Pokud chcete vytvořit proměnnou v určitém oboru, použijte modifikátor oboru nebo parametr Scope pro 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 New-AliasScope rutin , Set-Aliasnebo Get-Alias . 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 jinému. Obor 0 představuje aktuální nebo místní obor. Obor 1 označuje bezprostředně nadřazený obor. Obor 2 označuje nadřazený nadřazený obor atd. Číslování oborů je užitečné, pokud jste vytvořili mnoho rekurzivních oborů.

Použití zdrojového zápisu tečky s oborem

Skripty a funkce se řídí všemi pravidly oboru. Vytvoříte je v konkrétním oboru a ovlivní jenom tento obor, pokud k jeho změně nepoužijete parametr rutiny nebo modifikátor oboru.

K aktuálnímu oboru ale můžete přidat skript nebo funkci pomocí zápisu zdroje tečky. Při spuštění skriptu v aktuálním oboru jsou v aktuálním oboru k dispozici všechny funkce, aliasy a proměnné, které skript vytvoří.

Pokud chcete přidat funkci k aktuálnímu 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í nastavení 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

Pokud ke spuštění funkce nebo skriptu použijete operátor volání (&), nepřidá se 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.

Aliasy, funkce nebo proměnné, které Sample.ps1 skript vytvoří, nejsou v aktuálním oboru k dispozici.

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í, nejedná se ale o podřízené 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 naváže 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 prostředí s omezením, má svůj vlastní obor, ale relace není podřízeným oborem relace, ve které byla vytvořena. Relace začíná 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ě 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 v relaci.

Ve výchozím nastavení se moduly načítají do nejvyšší úrovně aktuálního stavu relace , a ne do aktuálního oboru. Aktuální stav relace může být stav relace modulu nebo globální stav relace. Přidáním modulu do relace se obor nezmění. Pokud jste v globálním oboru, moduly se načtou do stavu globální relace. Všechny exporty se umístí do globálních tabulek. Pokud modul2 načtete z modulu1 , modul2 se načte do stavu relace modulu1, nikoli do stavu globální relace. Všechny exporty z modulu 2 jsou umístěny v horní části stavu relace module1. Pokud použijete Import-Module -Scope local, exporty se umístí do objektu aktuálního oboru, nikoli do nejvyšší úrovně. Pokud jste v modulu a použijete Import-Module -Scope global (nebo Import-Module -Global) k načtení jiného modulu, načtou se tento modul a jeho exporty do stavu globální relace místo do stavu místní relace modulu. Tato funkce byla navržena pro psaní modulů, které manipulují s moduly. Modul WindowsCompatibility to provede k importu modulů proxy serveru do stavu globální 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, dáme 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. Když zadáte vnořenou výzvu, bude vnořená výzva podmnožinou prostředí. Zůstanete ale v místním rozsahu.

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

Privátní možnost

Aliasy a proměnné mají vlastnost Option , která může mí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 ani změnit mimo tento rozsah.

Pokud například vytvoříte proměnnou, která má v globálním oboru privátní možnost, a pak spustíte skript, Get-Variable příkazy ve skriptu privátní proměnnou nezobrazí. Použití modifikátoru globálního oboru v této instanci nezobrazí privátní proměnnou.

Pomocí parametru New-VariableOption rutin , Set-Variable, New-Aliasa Set-Alias můžete nastavit hodnotu vlastnosti Option na Private.

Viditelnost

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

Vlastnost Visibility přebírá Public hodnoty a Private . Položky, které mají soukromou viditelnost, je možné zobrazit a změnit pouze v kontejneru, ve kterém byly vytvořeny. Pokud je kontejner přidán nebo importován, položky, které mají soukromou viditelnost, nelze zobrazit ani změnit.

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

  • Pokud vytvoříte položku s privátní viditelností v globálním oboru, nebudete ji moct zobrazit ani změnit v žádném oboru.
  • Pokud se pokusíte zobrazit nebo změnit hodnotu proměnné s privátní viditelností, vrátí PowerShell chybovou zprávu.

Pomocí rutin a Set-Variable můžete New-Variable vytvořit proměnnou s 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 pomocí následujícího příkazu zobrazíte hodnotu $ConfirmPreference proměnné v místním oboru:

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 poté hlásí její hodnotu v oboru skriptu. Výstup by se měl podobat následujícímu 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 neovlivňují hodnotu proměnné v nadřazené oblasti.

Příklad 2: Zobrazení hodnoty proměnné v různých oborech

Pomocí modifikátorů oboru můžete zobrazit hodnotu 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í verzi $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.ps1 by se výstup měl 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 Soukromé 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í verzi $test proměnné.

V Sample.ps1:

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

Po dokončení skriptu se globální hodnota $test změní.

PS>  $test
Local

Příklad 4: Vytvoření privátní proměnné

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

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

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

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

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

Dále vytvořte skript Sample.ps1, 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žijí $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. Pokud chcete v PowerShellu 2.0 označit, ž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é