about_Scopes

Rövid leírás

Ismerteti a Hatókör fogalmát a PowerShellben, és bemutatja, hogyan állíthatja be és módosíthatja az elemek hatókörét.

Hosszú leírás

A PowerShell azzal védi a változókhoz, aliasokhoz, függvényekhez és PowerShell-meghajtókhoz (PSDrive-hoz) való hozzáférést, hogy korlátozza az olvasási és módosítási helyeket. A PowerShell hatókörszabályokat használ annak biztosítására, hogy véletlenül ne módosítson olyan elemet, amelyet nem szabad módosítani.

A hatókör alapvető szabályai a következők:

  • A hatókörök beágyazhatók. A külső hatókört szülőhatókörnek nevezzük. A beágyazott hatókörök az adott szülő gyermekhatókörei.

  • Az elemek abban a hatókörben jelennek meg, amelyben létrehozták, és bármely gyermekhatókörben, hacsak nem teszi kifejezetten privátsá.

  • Az aktuális hatókörön kívüli hatókörhöz deklarálhat változókat, aliasokat, függvényeket és PowerShell-meghajtókat.

  • A hatókörön belül létrehozott elemek csak abban a hatókörben módosíthatók, amelyben létrehozták, hacsak nem ad meg külön hatókört.

Ha létrehoz egy elemet egy hatókörben, és az elem egy másik hatókörben lévő elemmel osztja meg a nevét, előfordulhat, hogy az eredeti elem el van rejtve az új elem alatt, de nincs felülírva vagy módosítva.

PowerShell-hatókörök

A PowerShell a következő hatóköröket támogatja:

  • Globális: A Hatókör, amely a PowerShell indításakor vagy új munkamenet vagy runspace létrehozásakor lép érvénybe. A PowerShell indításakor meglévő változók és függvények a globális hatókörben lettek létrehozva, például az automatikus változók és a beállítási változók. A PowerShell-profilok változói, aliasai és függvényei szintén a globális hatókörben jönnek létre. A globális hatókör a munkamenet gyökérszintű szülőhatóköre.

  • Helyi: Az aktuális hatókör. A helyi hatókör lehet a globális vagy bármely más hatókör.

  • Szkript: A szkriptfájl futtatásakor létrehozott hatókör. Csak a szkriptben lévő parancsok futnak a szkript hatókörében. A parancsfájl parancsaihoz a szkript hatóköre a helyi hatókör.

Szülő- és gyermekhatókörök

Egy szkript vagy függvény meghívásával létrehozhat egy új gyermekhatókört. A hívó hatókör a szülőhatókör. A meghívott szkript vagy függvény a gyermekhatókör. A hívott függvények vagy szkriptek más függvényeket is meghívhatnak, és olyan gyermekhatókör-hierarchiát hozhatnak létre, amelynek gyökérhatóköre a globális hatókör.

Hacsak nem teszi kifejezetten privátsá az elemeket, a szülőhatókör elemei elérhetők a gyermekhatókör számára. A gyermekhatókörben létrehozott és módosított elemek azonban nincsenek hatással a szülőhatókörre, kivéve, ha explicit módon adja meg a hatókört az elemek létrehozásakor.

Megjegyzés

A modul függvényei nem futnak a hívó hatókör gyermekhatókörében. A modulok saját munkamenet-állapotukkal rendelkeznek, amely a globális hatókörhöz van kapcsolva. Minden modulkód egy saját gyökérhatókörrel rendelkező, modulspecifikus hierarchiában fut.

Öröklődés

A gyermekhatókör nem örökli a szülőhatókör változóit, aliasait és függvényeit. Ha egy elem nem privát, a gyermekhatókör megtekintheti a szülőhatókör elemeit. Az elemeket módosíthatja a szülőhatókör explicit megadásával, de az elemek nem részei a gyermekhatókörnek.

A gyermekhatókör azonban elemkészlettel jön létre. Általában az összes olyan aliast tartalmazza, amely rendelkezik az AllScope beállítással. Ezt a lehetőséget a cikk későbbi részében tárgyaljuk. Ez tartalmazza az összes olyan változót, amely rendelkezik az AllScope beállítással, valamint néhány automatikus változót.

Egy adott hatókör elemeinek megkereséséhez használja a hatókör paraméterét Get-Variable vagy Get-Aliasa .

A helyi hatókörben lévő összes változó lekéréséhez például írja be a következőt:

Get-Variable -Scope local

A globális hatókörben lévő összes változó lekéréséhez írja be a következőt:

Get-Variable -Scope global

Hatókör-módosítók

A változók, aliasok vagy függvénynevek a következő választható hatókörmódosítók bármelyikét tartalmazhatják:

  • global: – Azt adja meg, hogy a név létezik-e a globális hatókörben.

  • local: – Azt adja meg, hogy a név létezik a Helyi hatókörben. Az aktuális hatókör mindig a Helyi hatókör.

  • private: – Megadja, hogy a név privát legyen, és csak az aktuális hatókör számára legyen látható.

    Megjegyzés

    private A nem hatókör. Ez egy olyan beállítás , amely megváltoztatja egy elem láthatóságát azon a hatókörön kívül, ahol az elem definiálva van.

  • script: – Megadja, hogy a név létezik-e a szkript hatókörében. A szkripthatókör a legközelebbi elődszkript-fájl hatóköre, vagy globális , ha nincs legközelebbi elődszkriptfájl.

  • using: – Egy másik hatókörben definiált változók elérésére szolgál, miközben szkripteket futtat az olyan parancsmagokon keresztül, mint az Start-Job és Invoke-Command.

  • workflow: – Megadja, hogy a név létezik-e egy munkafolyamatban. Megjegyzés: A Munkafolyamatok nem támogatottak a PowerShell 6-os és újabb verzióiban.

  • <variable-namespace> – Egy PowerShell PSDrive-szolgáltató által létrehozott módosító. Például:

    Névtér Description
    Alias: Az aktuális hatókörben definiált aliasok
    Env: Az aktuális hatókörben definiált környezeti változók
    Function: Az aktuális hatókörben definiált függvények
    Variable: Az aktuális hatókörben definiált változók

A parancsfájlok alapértelmezett hatóköre a szkripthatókör. A függvények és aliasok alapértelmezett hatóköre a helyi hatókör, még akkor is, ha egy szkriptben vannak definiálva.

Hatókörmódosítók használata

Egy új változó, alias vagy függvény hatókörének megadásához használjon hatókör-módosítót.

Egy változó hatókör-módosítójának szintaxisa a következő:

$[<scope-modifier>:]<name> = <value>

Egy függvény hatókör-módosítójának szintaxisa a következő:

function [<scope-modifier>:]<name> {<function-body>}

A következő parancs, amely nem használ hatókör-módosítót, létrehoz egy változót az aktuális vagy a helyi hatókörben:

$a = "one"

Ha ugyanazt a változót szeretné létrehozni a globális hatókörben, használja a hatókör-módosítót global: :

$global:a = "one"
Get-Variable a | Format-List *

Figyelje meg a Láthatóság és beállítások tulajdonság értékeit.

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

Hasonlítsa össze ezt egy privát változóval:

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

private A hatókör-módosító használata a Beállítások tulajdonságot a következőre Privateállítja.

Name        : pVar
Description :
Value       : Private variable
Visibility  : Public
Module      :
ModuleName  :
Options     : Private
Attributes  : {}

Ha ugyanazt a változót szeretné létrehozni a szkript hatókörében, használja a script: hatókör-módosítót:

$script:a = "one"

A hatókör-módosító függvényekkel is használható. A következő függvénydefiníció létrehoz egy függvényt a globális hatókörben:

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

A hatókör-módosítók használatával egy másik hatókörben lévő változóra is hivatkozhat. A következő parancs a $test változóra hivatkozik, először a helyi, majd a globális hatókörben:

$test
$global:test

A Using: hatókör-módosító

A használat egy speciális hatókör-módosító, amely egy helyi változót azonosít egy távoli parancsban. Módosító nélkül a PowerShell azt várja, hogy a távoli parancsok változói definiálva legyenek a távoli munkamenetben.

A Using hatókör-módosító a PowerShell 3.0-ban érhető el.

A munkameneten kívül végrehajtott szkriptek vagy parancsok esetében a Using hatókör-módosítóra van szükség ahhoz, hogy változóértékeket ágyazzon be a hívó munkamenet hatóköréből, hogy a munkameneten kívüli kód hozzáférhessen azokhoz. A Using hatókör-módosító a következő környezetekben támogatott:

  • Távolról végrehajtott parancsok, a ComputerName, HostName, SSHConnection vagy Session paraméterek (távoli munkamenet) használatával indítva Invoke-Command
  • Háttérfeladatok, első lépések Start-Job (folyamaton kívüli munkamenet)
  • Szálfeladatok, elindítva Start-ThreadJob vagy ForEach-Object -Parallel (külön szál-munkamenetben)

A környezettől függően a beágyazott változóértékek vagy független másolatok a hívó hatókörében lévő adatokról, vagy hivatkoznak rá. A távoli és a folyamaton kívüli munkamenetekben mindig független másolatok.

További információ: about_Remote_Variables.

A szál-munkamenetekben a rendszer hivatkozással továbbítja őket. Ez azt jelenti, hogy a híváshatókör változói módosíthatók egy másik szálon. A változók biztonságos módosításához szálszinkronizálás szükséges.

További információ:

Változóértékek szerializálása

A távolról végrehajtott parancsok és háttérfeladatok folyamaton kívül futnak. A folyamaton kívüli munkamenetek XML-alapú szerializálással és deszerializálással teszik elérhetővé a változók értékeit a folyamathatárok között. A szerializálási folyamat az objektumokat PSObject objektummá alakítja, amely az eredeti objektumtulajdonságokat tartalmazza, a metódusait azonban nem.

Korlátozott típusok esetén a deszerializálás újrahidratálja az objektumokat az eredeti típusra. A rehidratált objektum az eredeti objektumpéldány másolata. Típustulajdonságokkal és metódusokkal rendelkezik. Egyszerű típusok, például System.Version esetén a másolat pontos. Összetett típusok esetén a másolat nem tökéletes. A rehidratált tanúsítványobjektumok például nem tartalmazzák a titkos kulcsot.

Az összes többi típus példányai PSObject példányok. A PSTypeNames tulajdonság tartalmazza az eredeti típusnevet deszerializált előtaggal, például : Deserialized.System.Data.DataTable

Az AllScope beállítás

A változók és aliasok option tulajdonsága az AllScope értéket is figyelembe veheti. Az AllScope tulajdonságú elemek a létrehozott gyermekhatókörök részévé válnak, de a szülőhatókörök nem öröklik visszamenőlegesen azokat.

Az AllScope tulajdonságot tartalmazó elem látható a gyermekhatókörben, és ennek a hatókörnek a része. Az elem bármely hatókörben történő módosítása hatással van az összes olyan hatókörre, amelyben a változó definiálva van.

Hatókör kezelése

Számos parancsmag rendelkezik egy Hatókör paraméterrel, amely lehetővé teszi elemek beolvasását vagy beállítását (létrehozását és módosítását) egy adott hatókörben. A következő paranccsal keresse meg a munkamenet összes olyan parancsmagját, amely hatókörparaméterrel rendelkezik:

Get-Help * -Parameter scope

Az adott hatókörben látható változók megkereséséhez használja a Scope következő paramétert Get-Variable: . A látható változók közé tartoznak a globális változók, a szülőhatókör változói és az aktuális hatókör változói.

A következő parancs például lekéri a helyi hatókörben látható változókat:

Get-Variable -Scope local

Ha változót szeretne létrehozni egy adott hatókörben, használja a hatókör-módosító vagy a hatókör paraméterét Set-Variable. A következő parancs létrehoz egy változót a globális hatókörben:

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

A hatókör megadásához a , Set-Aliasvagy Get-Alias parancsmagok Hatókör paraméterét New-Aliasis használhatja. A következő parancs létrehoz egy aliast a globális hatókörben:

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

Ha egy adott hatókörben szeretné lekérni a függvényeket, használja a Get-Item parancsmagot, amikor a hatókörben van. A Get-Item parancsmag nem rendelkezik Hatókör paraméterrel.

Megjegyzés

A Hatókör paramétert használó parancsmagok esetében szám szerint is hivatkozhat a hatókörökre. A szám az egyik hatókör egymáshoz viszonyított pozícióját írja le. A 0. hatókör az aktuális vagy helyi hatókört jelöli. Az 1. hatókör az azonnali szülőhatókört jelöli. A 2. hatókör a szülőhatókör szülője, és így tovább. A számozott hatókörök akkor hasznosak, ha számos rekurzív hatókört hozott létre.

Pontforrás jelölésének használata hatókörrel

A szkriptek és függvények a hatókör összes szabályát követik. Ezeket egy adott hatókörben hozza létre, és csak erre a hatókörre vannak hatással, hacsak nem használ parancsmagparamétert vagy hatókör-módosítót a hatókör módosításához.

A pontforrás jelölésével azonban hozzáadhat egy szkriptet vagy függvényt az aktuális hatókörhöz. Ezután, amikor egy szkript az aktuális hatókörben fut, a szkript által létrehozott függvények, aliasok és változók elérhetők az aktuális hatókörben.

Ha hozzá szeretne adni egy függvényt az aktuális hatókörhöz, írjon be egy pont (.) és egy szóközt a függvény hívásában szereplő függvény elérési útja és neve előtt.

Ha például a Sample.ps1 szkriptet a szkript hatókörében lévő C:\Scripts könyvtárból szeretné futtatni (ez a szkriptek alapértelmezett beállítása), használja a következő parancsot:

c:\scripts\sample.ps1

A Sample.ps1 szkript helyi hatókörben való futtatásához használja a következő parancsot:

. c:\scripts.sample.ps1

Ha a híváskezelőt (&) használja egy függvény vagy szkript futtatásához, az nem lesz hozzáadva az aktuális hatókörhöz. Az alábbi példa a híváskezelőt használja:

& c:\scripts.sample.ps1

A híváskezelőről a about_operators olvashat bővebben.

A Sample.ps1 szkript által létrehozott aliasok, függvények és változók nem érhetők el az aktuális hatókörben.

Hatókör nélküli korlátozás

Néhány PowerShell-fogalom hasonló a hatókörhöz vagy a hatókörhöz. Ezek a fogalmak összekeverhetők a hatókörrel vagy a hatókör viselkedésével.

A munkamenetek, modulok és beágyazott kérések önálló környezetek, de nem a globális hatókör gyermekhatókörei a munkamenetben.

Munkamenetek

A munkamenet olyan környezet, amelyben a PowerShell fut. Amikor munkamenetet hoz létre egy távoli számítógépen, a PowerShell állandó kapcsolatot létesít a távoli számítógéppel. Az állandó kapcsolat lehetővé teszi, hogy a munkamenetet több kapcsolódó parancshoz használja.

Mivel a munkamenet tartalmazott környezet, saját hatókörrel rendelkezik, de a munkamenet nem annak a munkamenetnek a gyermekhatóköre, amelyben létrehozták. A munkamenet a saját globális hatókörével kezdődik. Ez a hatókör független a munkamenet globális hatókörétől. A munkamenetben létrehozhat gyermekhatóköröket. Futtathat például egy szkriptet egy gyermekhatókör létrehozásához egy munkamenetben.

Modulok

PowerShell-modullal megoszthatja és elérhetővé teheti a PowerShell-eszközöket. A modul egy olyan egység, amely parancsmagokat, szkripteket, függvényeket, változókat, aliasokat és más hasznos elemeket tartalmazhat. Ha nincs explicit módon definiálva, a modul elemei nem érhetők el a modulon kívül. Ezért hozzáadhatja a modult a munkamenethez, és anélkül használhatja a nyilvános elemeket, hogy a többi elem felülírhatná a munkamenet parancsmagjait, szkripteit, függvényeit és egyéb elemeit.

Alapértelmezés szerint a modulok az aktuális munkamenet állapotának legfelső szintjére töltődnek be, nem az aktuális hatókörbe. Az aktuális munkamenet-állapot lehet egy modul munkamenet-állapota vagy a globális munkamenet állapota. A modul munkamenethez való hozzáadása nem változtatja meg a hatókört. Ha a globális hatókörben van, akkor a modulok betöltve lesznek a globális munkamenet állapotába. Az exportálások a globális táblákba kerülnek. Ha a 2. modult az 1 . modulból tölti be, a 2. modul nem globális munkamenet-állapotba, hanem az1. modul munkamenetállapotába lesz betöltve. A 2. modulból származó exportálások a modul1 munkamenet-állapotának elejére kerülnek. Ha ezt használja Import-Module -Scope local, akkor az exportálások a legfelső szint helyett az aktuális hatókörobjektumba kerülnek. Ha egy modulban tölt Import-Module -Scope global be (vagy Import-Module -Global) egy másik modult, akkor a modul és exportálása a modul helyi munkamenet-állapota helyett a globális munkamenet állapotába lesz betöltve. Ez a funkció a modulokat módosító modulok írására lett tervezve. A Windows kompatibilitási modulja ezt a proxymodulok globális munkamenet-állapotba való importálására teszi.

A munkamenet-állapoton belül a modulok saját hatókörrel rendelkeznek. Vegye figyelembe a következő modult C:\temp\mod1.psm1:

$a = "Hello"

function foo {
    "`$a = $a"
    "`$global:a = $global:a"
}

Most létrehozunk egy globális változót $a, megadunk neki egy értéket, és meghívjuk a foo függvényt.

$a = "Goodbye"
foo

A modul deklarálja a változót $a a modul hatókörében, majd a foo függvény mindkét hatókörben adja ki a változó értékét.

$a = Hello
$global:a = Goodbye

Beágyazott parancssorok

A beágyazott kéréseknek nincs saját hatókörük. Beágyazott parancssor megadásakor a beágyazott parancssor a környezet egy részhalmaza. De továbbra is a helyi hatókörön belül marad.

A szkripteknek saját hatókörük van. Ha egy szkript hibakeresését végzi, és eléri a töréspontot a szkriptben, adja meg a szkript hatókörét.

Privát beállítás

Az aliasok és a változók option tulajdonsága a Privateértéket is figyelembe veheti. A beállítással rendelkező Private elemek megtekinthetők és módosíthatók abban a hatókörben, amelyben létrehozták őket, de nem tekinthetők meg és nem módosíthatók ezen a hatókörön kívül.

Ha például létrehoz egy olyan változót, amelynek privát lehetősége van a globális hatókörben, majd futtat egy szkriptet, Get-Variable a szkript parancsai nem jelenítik meg a privát változót. A globális hatókör-módosító ebben a példányban nem jeleníti meg a privát változót.

A , Set-Variable, New-Aliasés Set-Alias parancsmagok Option paraméterével New-Variablea Option tulajdonság értékét Privát értékre állíthatja.

Láthatóság

Egy változó vagy alias Láthatóság tulajdonsága határozza meg, hogy látható-e az elem azon a tárolón kívül, amelyben létrejött. A tároló lehet modul, szkript vagy beépülő modul. A láthatóság ugyanúgy van kialakítva a tárolókhoz, mint a Privatehatókörökhöz készült Option tulajdonság értéke.

A Láthatóság tulajdonság az és Private az Public értékeket veszi fel. A privát láthatóságú elemek csak abban a tárolóban tekinthetők meg és módosíthatók, amelyben létrehozták őket. A tároló hozzáadása vagy importálása esetén a privát láthatóságú elemek nem tekinthetők meg és nem módosíthatók.

Mivel a láthatóság tárolókhoz készült, a hatókörökben másként működik.

  • Ha olyan elemet hoz létre, amely privát láthatóságtal rendelkezik a globális hatókörben, egyetlen hatókörben sem tekintheti meg és nem módosíthatja az elemet.
  • Ha privát láthatóságú változó értékét próbálja meg megtekinteni vagy módosítani, a PowerShell hibaüzenetet ad vissza.

A parancsmagok és Set-Variable a New-Variable parancsmagok használatával létrehozhat egy privát láthatóságú változót.

Példák

1. példa: Változóérték módosítása csak szkriptben

A következő parancs módosítja a $ConfirmPreference változó értékét egy szkriptben. A módosítás nincs hatással a globális hatókörre.

Először is a következő paranccsal jelenítheti meg a $ConfirmPreference változó értékét a helyi hatókörben:

PS>  $ConfirmPreference
High

Hozzon létre egy Scope.ps1 szkriptet, amely a következő parancsokat tartalmazza:

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

Futtassa a szkriptet. A szkript módosítja a $ConfirmPreference változó értékét, majd jelentést készít annak értékéről a szkript hatókörében. A kimenetnek a következőhöz hasonlónak kell lennie:

The value of $ConfirmPreference is Low.

Ezután tesztelje $ConfirmPreference a változó aktuális értékét az aktuális hatókörben.

PS>  $ConfirmPreference
High

Ez a példa azt mutatja be, hogy a szkript hatókörében lévő változó értékének módosítása nincs hatással a változó szülőhatókörbeli értékére.

2. példa: Változóérték megtekintése különböző hatókörökben

A hatókör-módosítók használatával megtekintheti egy változó értékét a helyi és a szülőhatókörben.

Először határozzon meg egy változót $test a globális hatókörben.

$test = "Global"

Ezután hozzon létre egy Sample.ps1 szkriptet, amely meghatározza a változót $test . A szkriptben használjon hatókör-módosítót a változó globális vagy helyi verzióira $test való hivatkozáshoz.

A Sample.ps1:

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

A Sample.ps1 futtatásakor a kimenetnek a következőhöz hasonlónak kell lennie:

The local value of $test is Local.
The global value of $test is Global.

Amikor a szkript elkészült, csak a globális érték $test lesz meghatározva a munkamenetben.

PS>  $test
Global

3. példa: Változó értékének módosítása szülőhatókörben

Ha nem véd meg egy elemet a Privát beállítással vagy más módszerrel, megtekintheti és módosíthatja egy változó értékét egy szülőhatókörben.

Először határozzon meg egy változót $test a globális hatókörben.

$test = "Global"

Ezután hozzon létre egy Sample.ps1 szkriptet, amely meghatározza a változót $test . A szkriptben használjon hatókör-módosítót a változó globális vagy helyi verzióira $test való hivatkozáshoz.

A Sample.ps1:

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

Amikor a szkript elkészült, a globális érték $test megváltozik.

PS>  $test
Local

4. példa: Privát változó létrehozása

A privát változó olyan változó, amelynek Option tulajdonsága Privateértéke . Private a változókat a gyermekhatókör örökli, de csak abban a hatókörben tekinthetők meg vagy módosíthatók, amelyben létrehozták őket.

A következő parancs létrehoz egy privát változót $ptest a helyi hatókörben.

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

A helyi hatókör értékét megjelenítheti és módosíthatja $ptest .

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

Ezután hozzon létre egy Sample.ps1 szkriptet, amely a következő parancsokat tartalmazza. A parancs megpróbálja megjeleníteni és módosítani a következő értékét $ptest: .

A Sample.ps1:

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

A $ptest változó nem látható a szkript hatókörében, a kimenet üres.

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

5. példa: Helyi változó használata távoli parancsban

A helyi munkamenetben létrehozott távoli parancs változóihoz használja a Using hatókör-módosítót. A PowerShell feltételezi, hogy a távoli parancsok változói a távoli munkamenetben lettek létrehozva.

A szintaxis a következő:

$Using:<VariableName>

Az alábbi parancsok például létrehoznak egy változót $Cred a helyi munkamenetben, majd egy távoli parancsban használják a $Cred változót:

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

A Using hatókör a PowerShell 3.0-ban lett bevezetve. A PowerShell 2.0-ban a következő parancsformátummal jelezheti, hogy egy változót a helyi munkamenetben hoztak létre.

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

Lásd még