O oborech
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) tím, že omezuje jejich čtení a změny. PowerShell používá pravidla oboru, aby zajistil, že nechtěně nezměníte položku, která by se neměla změnit.
Níže jsou uvedená 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. Proměnné, aliasy, funkce nebo jednotky PowerShellu můžete umístit do jednoho nebo více 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 nebude přepsána ani změněna.
Obory PowerShellu
PowerShell podporuje následující obory:
Globální: Obor, který platí při spuštění PowerShellu. Proměnné a funkce, které jsou přítomné 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 v profilech PowerShellu se také vytvářejí v globálním oboru.
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ějí jenom příkazy ve skriptu. Pro příkazy ve skriptu je oborem skriptu místní obor.
Poznámka
Privátní není obor. Jedná se o možnost , která změní viditelnost položky mimo obor, ve kterém je položka definována.
Nadřazené a podřízené obory
Nový obor můžete vytvořit spuštěním skriptu nebo funkce, vytvořením relace nebo spuštěním nové instance PowerShellu. Když vytvoříte nový obor, výsledkem bude nadřazený obor (původní obor) a podřízený obor (obor, který jste vytvořili).
V PowerShellu jsou všechny obory podřízenými obory globálního oboru, ale můžete vytvořit mnoho oborů a mnoho rekurzivních oborů.
Pokud explicitně nenasadíte položky jako soukromé, budou položky v nadřazené oblasti k dispozici pro podřízený obor. Položky, které vytvoříte a změníte v podřízené oblasti, však nemají vliv na nadřazený obor, pokud explicitně nezadáte obor při vytváření položek.
Dědičnost
Podřízený obor nedědí proměnné, aliasy a funkce z nadřazeného oboru. Pokud není položka soukromá, může podřízený obor 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 však 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. Obsahuje všechny proměnné, které mají možnost AllScope , a některé automatické proměnné.
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 místním oboru . 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.script:
– Určuje, že název existuje v oboru skriptu . Obor skriptu je obor nejbližšího souboru nadřazeného skriptu nebo globální , pokud neexistuje žádný nejbližší soubor 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 jakoStart-Job
aInvoke-Command
.workflow:
– Určuje, že název existuje v rámci pracovního postupu. Poznámka: PowerShell Core nepodporuje pracovní postupy.<variable-namespace>
– Modifikátor vytvořený poskytovatelem 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ím oborem pro skripty je obor skriptu. Výchozím oborem pro funkce a aliasy je místní obor, a to i v případě, že jsou definované ve skriptu.
Použití modifikátorů oboru
Pokud chcete zadat 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"
Pokud chcete vytvořit stejnou proměnnou v oboru skriptu , použijte script:
modifikátor oboru:
$script:a = "one"
S funkcemi 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.
V PowerShellu 3.0 je zaveden modifikátor oboru Using .
Další informace najdete v tématu about_Remote_Variables.
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-Alias
Scope rutin , Set-Alias
nebo 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 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í 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.
Ochrana osobních údajů modulu se chová jako obor, ale přidáním modulu do relace se obor nezmění. Modul nemá vlastní obor, i když skripty v modulu, stejně jako všechny skripty PowerShellu, mají svůj vlastní obor.
Ve výchozím nastavení se moduly načítají do nejvyšší úrovně aktuálního stavu relace , a ne do aktuálního oboru. Může se jednat o stav relace modulu nebo globální stav relace. 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 modulu1. 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 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 globálního oboru.
Vnořené výzvy
Podobně 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í možnost Soukromé , je možné 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-Variable
Option rutin , Set-Variable
, New-Alias
a 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 hodnota Private vlastnosti Option pro obory.
Vlastnost Visibility přebírá hodnoty Public 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
Create 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. Privátní proměnné dědí podřízený obor, ale je možné 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 se v místní relaci vytvořila proměnná, 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