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, aby se zajistilo, že neúmyslně nezměníte položku, která by se neměla měnit.
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 ve všech podřízených oborech, pokud ji explicitně nenastavíte jako soukromou.
Proměnné, aliasy, funkce a jednotky PowerShellu můžete deklarovat v oboru mimo aktuální rozsah.
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í svůj název s položkou v jiném oboru, může být původní položka skryta pod novou položkou, ale nebude přepsána ani změněna.
Rozsahy PowerShellu
PowerShell podporuje následující obory:
Globální: Rozsah, který platí při spuštění PowerShellu nebo při vytvoření nové relace nebo prostředí runspace. Proměnné a funkce, které jsou k dispozici při spuštění PowerShellu, byly vytvořeny v globálním rozsahu, 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í rozsah. Místním oborem může být globální obor nebo jakýkoli jiný obor.
Skript: Rozsah, který je vytvořen při běhu souboru skriptu. V oboru skriptu jsou spuštěny pouze příkazy ve skriptu. Pro příkazy ve skriptu je oborem skriptu místní obor.
Poznámka:
Soukromé není rozsah. Jedná se o možnost , která mění viditelnost položky mimo rozsah, ve kterém je položka definována.
Nadřazené a podřízené rozsahy
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.
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 a změníte v podřízeném oboru, však nemají vliv na nadřazený rozsah, pokud při vytváření položek rozsah explicitně neurčíte.
Poznámka:
Funkce z modulu nejsou spuštěny v podřízeném oboru oboru volání. Moduly mají svůj vlastní stav relace, který je spojen s globálním rozsahem. Veškerý kód modulu běží v hierarchii oborů, 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 položka není soukromá, může podřízený obor zobrazit položky v nadřazeném oboru. 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.
Vytvoří se však podřízený obor 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 , plus některé automatické proměnné.
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
Modifikátory rozsahu
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.private:– Určuje, že název je soukromý a je viditelný pouze pro aktuální oblast.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í skriptů pomocí rutin jako aStart-JobInvoke-Command.workflow:– Určuje, že název existuje v pracovním postupu. Poznámka: Pracovní postupy nejsou podporovány v prostředí PowerShell verze 6 a novějších.<variable-namespace>- Modifikátor vytvořený poskytovatelem PSDrive 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ím rozsahem funkcí a aliasů je lokální rozsah, a to i v případě, že jsou definovány 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"
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 se zavádí 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ě spuštěné příkazy, iniciované pomocí
Invoke-Commands parametry ComputerName, HostName, SSHConnection nebo Session (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)
Podle kontextu jsou vložené hodnoty proměnných buď nezávislé kopie dat v oboru volajícího, nebo odkazy na ně. Ve vzdálených a mimoprocesních relacích jsou vždy nezávislé kopie.
Další informace naleznete v dokumentaci about_Remote_Variables.
V kontextu vláken se předávají jako reference. To znamená, že je možné upravit proměnné rozsahu volání v jiném vlákně. Bezpečná úprava proměnných vyžaduje synchronizaci vláken.
Další informace najdete tady:
- Start-ThreadJob
- ForEach-Object
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 vlastnosti původního objektu, 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á typové vlastnosti a metody. U jednoduchých typů, například System.Version, je kopie přesná. U složitých typů je kopie neúplná. 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 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í 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 rozsahy.
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.
Správa 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. Rutina Get-Item nemá parametr Scope .
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í tečkového zdrojového zápisu s rozsahem
Skripty a funkce se řídí všemi pravidly rozsahu. 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.
Do aktuálního oboru ale můžete přidat skript nebo funkci pomocí tečkového zdrojového zápisu. Když je pak skript spuštěn v aktuálním oboru, jsou všechny funkce, aliasy a proměnné, které skript vytvoří, k dispozici v aktuálním oboru.
Chcete-li přidat funkci do aktuálního oboru, zadejte tečku (.) a mezeru před cestu a název funkce ve volání funkce.
Chcete-li například 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
Chcete-li spustit skript Sample.ps1 v místním oboru, použijte následující příkaz:
. c:\scripts.sample.ps1
Použijete-li operátor volání (&) ke spuštění funkce nebo skriptu, nebude přidán do aktuálního rozsahu. Následující příklad používá operátor volání:
& c:\scripts.sample.ps1
Více o operátorovi hovoru si můžete přečíst v about_operators.
Všechny aliasy, funkce nebo proměnné, které skript Sample.ps1 vytvoří, nejsou v aktuálním oboru k dispozici.
Omezení bez rozsahu
Několik konceptů PowerShellu se podobá oboru nebo interaguje s rozsahem. Tyto pojmy mohou být zaměňovány s rozsahem nebo chováním rozsahu.
Relace, moduly a vnořené výzvy jsou samostatná prostředí, ale nejsou podřízenými obory globálního oboru v relaci.
Zasedání
Session 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á svůj vlastní rozsah, ale relace není podřízeným rozsahem 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 není explicitně definováno, položky v modulu nejsou 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.
Ve výchozím nastavení jsou moduly načteny 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ím modulu do relace se nezmění rozsah. Pokud se nacházíte v globálním rozsahu, moduly se načtou do globálního stavu relace. Veškeré exporty jsou umístěny do globálních tabulek.
Pokud načtete modul2 z modulu1 , modul2 se načte do stavu relace modulu1, nikoli do globálního stavu relace. Všechny exporty z module2 jsou umístěny v horní části stavu relace 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 použijete 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 namísto místního stavu relace modulu. Tato funkce byla navržena pro psaní modulů, které manipulují s moduly. Modul WindowsCompatibility to provede importem modulů proxy do globálního stavu relace.
V rámci stavu relace mají moduly svůj vlastní rozsah. 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
Vnořené výzvy
Vnořené výzvy nemají svůj 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 nabývat hodnoty Private. Položky s možností Soukromé lze zobrazit a změnit v rozsahu, ve kterém byly vytvořeny, ale nelze je zobrazit ani změnit mimo tento rozsah.
Pokud například vytvoříte proměnnou, která má soukromou volbu v globálním rozsahu, a pak spustíte skript, Get-Variable příkazy ve skriptu nezobrazí soukromou proměnnou. Při použití globálního modifikátoru oboru se v této instanci nezobrazí soukromá proměnná.
Pomocí parametru Option rutin , New-VariableSet-Variable, New-Aliasa Set-Alias můžete nastavit hodnotu vlastnosti Option na hodnotu 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 rozsahy.
Vlastnost Viditelnost 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řidán nebo importován, položky s privátní viditelností nelze zobrazit ani změnit.
Viditelnost je určena pro kontejnery, proto funguje v rozsahu jinak.
- Pokud vytvoříte položku, která má soukromou viditelnost v globálním rozsahu, 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í.
Příklady
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í rozsah.
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 nemají vliv na hodnotu proměnné v nadřazeném oboru.
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, výstup by měl vypadat podobně jako následující výstup:
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ém oboru
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ém 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 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í soukromé proměnné
Soukromá proměnná je proměnná, která má vlastnost Option , která má hodnotu Private. Soukromé proměnné jsou dě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ří soukromou proměnnou volanou $ptest v místním oboru.
New-Variable -Name ptest -Value 1 -Option private
Hodnotu můžete zobrazit a změnit v $ptest místním rozsahu.
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í v rozsahu skriptu viditelná, 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 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}
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é
- o_proměnných
- o_Proměnné_Prostředí
- o_Funkcích
- o_Skriptových_Blokech
- Start-ThreadJob