Megosztás a következőn keresztül:


Hatókörök

Rövid leírás

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

Hosszú leírás

A PowerShell megvédi a változókat, az aliasokat, a függvényeket és a PowerShell-meghajtókat (PSDrives) azáltal, hogy az olvasási és módosítási helyekre korlátozza a hozzáférést. A PowerShell hatókör-szabályokat használ annak biztosítására, hogy ne kelljen véletlenül módosítani egy olyan tételt, amely nem módosítható.

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

  • A hatókörök beágyazásra kerülhetnek. A külső hatókört szülő hatókörnek nevezzük. Bármely beágyazott hatókör a szülő alárendelt hatóköre.

  • Egy elem látható abban a hatókörben, amelyben létrehozták és bármely alárendelt hatókörben, kivéve, ha kifejezetten magánjellegűvé teszi. A változók, aliasok, függvények vagy PowerShell-meghajtók egy vagy több hatókörben helyezhetők el.

  • Egy hatókörön belül létrehozott elem csak abban a hatókörben módosítható, amelyben létrehozták, kivéve, ha explicit módon eltérő hatókört ad meg.

Ha egy hatókörben hoz létre egy elemeket, és az elem a nevét egy másik hatókörben lévő elemmel osztja meg, akkor előfordulhat, hogy az eredeti elem rejtve marad az új elem alatt, de nem bírálja felül vagy nem változtatja meg.

PowerShell-hatókörök

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

  • Globális: a PowerShell indításakor érvényben lévő hatókör. Azok a változók és függvények, amelyek akkor jelennek meg a PowerShell indításakor, ha a globális hatókörben lettek létrehozva, például automatikus változók és preferencia-változók. A PowerShell-profilokban szereplő változók, aliasok és függvények szintén a globális hatókörben jönnek létre.

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

  • Parancsfájl: a parancsfájl futtatása során létrehozott hatókör. A parancsfájl hatókörében csak a parancsfájlban szereplő parancsok futnak. Egy parancsfájl parancsaihoz a parancsfájl hatóköre a helyi hatókör.

Megjegyzés

A magánjellegű nem hatókör. Ez egy olyan lehetőség , amely megváltoztatja egy elem láthatóságát azon a hatókörön kívül, ahol az elem meg van határozva.

Szülő és gyermek hatókörök

Létrehozhat egy új hatókört egy parancsfájl vagy függvény futtatásával, egy munkamenet létrehozásával vagy a PowerShell új példányának elindításával. Új hatókör létrehozásakor az eredmény egy szülő hatókör (az eredeti hatókör) és egy alárendelt hatókör (a létrehozott hatókör).

A PowerShellben az összes hatókör a globális hatókör alárendelt hatóköre, de számos hatókört és számos rekurzív hatókört is létrehozhat.

Ha explicit módon nem végzi el az elemek magánjellegűvé tételét, a szülő hatókör elemei elérhetők lesznek a gyermek hatókörében. A gyermek hatókörben létrehozott és módosított elemek azonban nem befolyásolják a szülő hatókörét, kivéve, ha explicit módon megadja a hatókört az elemek létrehozásakor.

Öröklődés

A gyermek hatókör nem örökli a szülő hatókör változóit, aliasait és függvényeit. Ha egy elem magánjellegű, a gyermek hatóköre megtekintheti a szülő hatókörben lévő elemeket. Emellett a szülő hatókör explicit módon történő megadásával módosíthatja az elemeket, de az elemek nem részei a gyermek hatókörének.

A gyermek hatóköre azonban elemek készletével jön létre. Jellemzően a AllScope kapcsolóval rendelkező összes aliast tartalmazza. Ezt a lehetőséget a cikk későbbi részében tárgyaljuk. Tartalmazza a AllScope kapcsolóval rendelkező összes változót, valamint néhány automatikus változót is.

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

Ha például a helyi hatókörben lévő összes változót le szeretné kérni, írja be a következőt:

Get-Variable -Scope local

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

Get-Variable -Scope global

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

A változó, az alias vagy a függvény neve a következő választható hatókör-módosítók bármelyikét tartalmazhatja:

  • global:-Megadja, hogy a név létezik a globális hatókörben.

  • local:-Megadja, 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 magánjellegű , és csak az aktuális hatókörben látható.

  • script:-Megadja, hogy a név létezik a parancsfájl hatókörében. A parancsfájl hatóköre a legközelebbi őse parancsfájl hatóköre vagy globális , ha nincs legközelebbi őse parancsfájl.

  • using:-Egy másik hatókörben definiált változók elérésére szolgál, miközben parancsfájlokat futtat a (z) és rendszerű parancsmagok segítségével Start-Job Invoke-Command .

  • workflow:– Megadja, hogy a név létezik egy munkafolyamaton belül. Megjegyzés: a munkafolyamatok nem támogatottak a PowerShell Core-ban.

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

    Névtér Leírás
    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 parancsfájl hatóköre. A függvények és aliasok alapértelmezett hatóköre a helyi hatókör, még akkor is, ha egy parancsfájlban vannak definiálva.

Hatókör-mó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óban a hatókör-módosító 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, egy változót hoz létre az aktuális vagy 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- global: módosítót:

$global:a = "one"

Ha ugyanazt a változót szeretné létrehozni a parancsfájl 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ót a functions használatával is használhatja. A következő Function definition 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 más hatókörben lévő változóra is hivatkozhat. A következő parancs a $test változóra hivatkozik, amely először a helyi hatókörben, majd a globális hatókörben található:

$test
$global:test

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

A használata egy olyan speciális hatókör-módosító, amely egy távoli parancsban azonosítja a helyi változót. Módosító nélkül a PowerShell a távoli munkamenetben definiálni kívánt változókat vár a távoli parancsokban.

A hatókör-módosító használata a PowerShell 3,0-ben lett bevezetve.

További információ: about_Remote_Variables.

A AllScope beállítás

A változók és az aliasok egy Option tulajdonsággal rendelkeznek, amely AllScopeértéket is igénybe vehet. A AllScope tulajdonsággal rendelkező elemek a létrehozott alárendelt hatókörök részévé válnak, de a szülő hatókörök nem öröklik visszamenőlegesen.

Az AllScope tulajdonsággal rendelkező elemek a gyermek hatókörben láthatók, és a hatókör részét képezik. A hatókörben lévő elemek módosításai hatással vannak az összes olyan hatókörre, amelyben a változó definiálva van.

Hatókör kezelése

Számos parancsmaghoz tartozik egy hatókör -paraméter, amely lehetővé teszi egy adott hatókör elemeinek megszerzését vagy beállítását (létrehozás és módosítás). A következő parancs használatával megkeresheti a munkamenetben lévő összes olyan parancsmagot, amely hatókör -paraméterrel rendelkezik:

Get-Help * -Parameter scope

Egy adott hatókörben látható változók megkereséséhez használja a Scope 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ébe tartozó változók és az aktuális hatókörben lévő változók.

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

Get-Variable -Scope local

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

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

A New-Alias Set-Alias hatókört a,, vagy parancsmagok scope paraméterével is Get-Alias meghatározhatja. A következő parancs egy aliast hoz létre a globális hatókörben:

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

Egy adott hatókörben lévő függvények beszerzéséhez használja a Get-Item parancsmagot, ha 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 a hatókörök száma alapján is megtekinthető. A szám egy hatókör relatív pozícióját írja le egy másikra. A 0. hatókör az aktuális vagy helyi hatókört jelöli. Az 1. hatókör a szülő közvetlen hatókörét jelzi. A 2. hatókör a szülő hatókör szülőjét jelöli, és így tovább. A számozott hatókörök akkor hasznosak, ha sok rekurzív hatókört hozott létre.

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

A parancsfájlok és a függvények a hatókör összes szabályát követik. Ezeket egy adott hatókörben kell létrehoznia, és csak az adott hatókörre van hatással, hacsak nem használ parancsmag-paramétert vagy hatókör-módosítót a hatókör módosításához.

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

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

Ha például a parancsfájl hatókörében lévő C:\Scripts könyvtárból szeretné futtatni a Sample.ps1 szkriptet (a parancsfájlok alapértelmezett értéke), használja a következő parancsot:

c:\scripts\sample.ps1

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

. c:\scripts.sample.ps1

Ha a Call operátor (&) segítségével futtat egy függvényt vagy parancsfájlt, a rendszer nem adja hozzá az aktuális hatókörhöz. A következő példa a Call operátort használja:

& c:\scripts.sample.ps1

További információ a hívási operátorról about_operators.

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

Korlátozás hatókör nélkül

Néhány PowerShell-koncepció hasonló a hatókörhöz vagy a hatókörhöz való interakcióhoz. Ezek a fogalmak összetéveszthető 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 alárendelt hatókörei a munkamenetben.

Munkamenetek

A munkamenetek olyan környezetek, amelyekben a PowerShell fut. Amikor távoli számítógépen hoz létre munkamenetet, 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ó parancsra is használhatja.

Mivel a munkamenet egy foglalt környezet, saját hatókörrel rendelkezik, de a munkamenet nem gyermek hatóköre annak a munkamenetnek, 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ével. Alárendelt hatóköröket hozhat létre a munkamenetben. Futtathat például egy parancsfájlt egy alárendelt hatókör létrehozásához egy munkamenetben.

Modulok

PowerShell-modul használatával megoszthatja és továbbíthatja a PowerShell-eszközöket. A modul olyan egység, amely parancsmagokat, parancsfájlokat, függvényeket, változókat, aliasokat és más hasznos elemeket tartalmazhat. Hacsak nincs explicit módon meghatározva, a modul elemei nem érhetők el a modulon kívül. Ezért felveheti a modult a munkamenetbe, és a nyilvános elemeket nem kell aggódnia, hogy a többi elem felülbírálja a munkamenetben lévő parancsmagokat, parancsfájlokat, függvényeket és egyéb elemeket.

Egy modul adatvédelme például egy hatókörhöz tartozik, de a modul hozzáadása egy munkamenethez nem változtatja meg a hatókört. Emellett a modulnak nincs saját hatóköre, bár a modulban lévő parancsfájlok, például az összes PowerShell-parancsfájl esetében a saját hatókörük van.

Alapértelmezés szerint a modulok az aktuális munkamenet-állapot legfelső szintjére töltődnek be, nem az aktuális hatókörbe. Ez lehet a modul munkamenet-állapota vagy a globális munkamenet-állapot. Ha a globális hatókörben van, a modulok betöltődik a globális munkamenet-állapotba. Minden exportálás a globális táblákba kerül. Ha a module2-t a module1- ből tölti be, a module2 a module1's munkamenet-állapotba tölti be, nem a globális munkamenet-állapotba. A module2-ből származó összes exportálás a module1's munkamenet-állapotának elejére kerül. A használata esetén Import-Module -Scope local az Exportálás az aktuális hatókör-objektumba kerül, nem a legfelső szinten. Ha modult használ, és a Import-Module -Scope global (vagy Import-Module -Global ) használatával betölti egy másik modult, a modul és az Exportálás a globális munkamenet-állapotba kerül, a modul helyi munkamenet-állapota helyett. Ez a szolgáltatás olyan modul írásához lett tervezve, amely a modulokat kezeli. A WindowsCompatibility modul ezt a lehetőséget biztosítja a proxy modulok globális hatókörbe való importálásához.

Beágyazott kérések

Hasonlóképpen, a beágyazott kérések nem rendelkeznek saját hatókörrel. Ha beágyazott üzenetet ad meg, a beágyazott kérdés a környezet egy részhalmaza. Azonban továbbra is a helyi hatókörön belül marad.

A parancsfájlok saját hatókörrel rendelkeznek. Ha hibakeresést végez egy parancsfájlban, és egy töréspontot ér el a parancsfájlban, a parancsfájl hatókörét kell megadnia.

Privát lehetőség

Az aliasok és a változók egy Option tulajdonsággal rendelkeznek, amely privátértéket is igénybe vehet. A magánjellegű lehetőséget tartalmazó elemek megtekinthetők és módosíthatók a létrehozásuk hatókörében, de nem tekinthetők meg és nem módosíthatók a hatókörön kívül.

Ha például olyan változót hoz létre, amely rendelkezik egy privát lehetőséggel a globális hatókörben, majd futtat egy parancsfájlt, Get-Variable a parancsfájlban szereplő parancsok nem jelenítik meg a privát változót. A globális hatókör-módosító használata ebben a példányban nem jelenik meg a privát változóban.

A (z),, és parancsmagok paraméterének beállításával New-Variable Set-Variable New-Alias Set-Alias állíthatja be az Option tulajdonság értékét magánjellegű értékre.

Láthatóság

Egy változó vagy alias láthatósági tulajdonsága határozza meg, hogy látható-e a tárolón kívüli elem, amelyben létrehozták. Egy tároló lehet modul, parancsfájl vagy beépülő modul. A láthatóságot úgy tervezték, hogy a tárolók ugyanúgy legyenek kialakítva, mint a hatókörökhöz.

A láthatósági tulajdonság a nyilvános és a privát értékeket veszi figyelembe. A magánjellegű láthatóságú elemek csak abban a tárolóban tekinthetők meg és módosíthatók, amelyben létrehozták őket. Ha a tárolót hozzáadják vagy importálják, a magánjellegű láthatóságú elemek nem tekinthetők meg és nem módosíthatók.

Mivel a láthatóságot tárolók számára tervezték, a hatókörben eltérően működik.

  • Ha a globális hatókörben magánjellegű láthatóságú elemeket hoz létre, akkor egyetlen hatókörben sem lehet megtekinteni vagy módosítani az elemeket.
  • Ha egy privát láthatóságú változó értékét próbálja meg megtekinteni vagy módosítani, a PowerShell egy hibaüzenetet ad vissza.

A New-Variable és a Set-Variable parancsmagok használatával olyan változókat hozhat létre, amelyek magánjellegű láthatósággal rendelkeznek.

Példák

1. példa: változó értékének módosítása csak egy parancsfájlban

A következő parancs $ConfirmPreference egy parancsfájlban módosítja a változó értékét. A módosítás nem befolyásolja a globális hatókört.

Először is a következő parancs használatával jelenítse meg a $ConfirmPreference változó értékét a helyi hatókörben:

PS>  $ConfirmPreference
High

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

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

Futtassa a szkriptet. A parancsfájl módosítja a $ConfirmPreference változó értékét, majd az értékét a parancsfájl hatókörében adja meg. A kimenetnek a következő kimenethez kell hasonlítani:

The value of $ConfirmPreference is Low.

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

PS>  $ConfirmPreference
High

Ez a példa azt mutatja, hogy a parancsfájl hatókörében lévő változó értékének módosítása nem befolyásolja a szülő hatókörében lévő változó értékét.

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

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

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

$test = "Global"

Ezután hozzon létre egy Sample.ps1 parancsfájlt, amely meghatározza a $test változót. A szkriptben a hatókör-módosító használatával tekintse át a változó globális vagy helyi verzióit $test .

Sample.ps1:

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

Sample.ps1 futtatásakor a kimenetnek a következő kimenethez kell hasonlítani:

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

A parancsfájl befejezésekor csak a globális érték $test van definiálva a munkamenetben.

PS>  $test
Global

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

Hacsak nem védi az elemet a privát vagy más módszer használatával, megtekintheti és módosíthatja a szülő hatókörében lévő változó értékét.

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

$test = "Global"

Ezután hozzon létre egy Sample.ps1 parancsfájlt, amely meghatározza a $test változót. A szkriptben a hatókör-módosító használatával tekintse át a változó globális vagy helyi verzióit $test .

Sample.ps1:

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

A parancsfájl befejezésekor a globális érték $test módosul.

PS>  $test
Local

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

A privát változó egy olyan változó, amely a Privateértékkel rendelkező Option tulajdonsággal rendelkezik. A gyermek hatókör örökli a privát változókat, de csak azokban a hatókörben lehet megtekinteni vagy módosítani, amelyben létrejöttek.

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

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

Megtekintheti és módosíthatja a $ptest helyi hatókör értékét.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

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

Sample.ps1:

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

A $ptest változó nem látható a parancsfájl 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 parancsban található változók esetében használja a Using hatókör-módosítót. A PowerShell feltételezi, hogy a távoli parancsokban lévő változók a távoli munkamenetben lettek létrehozva.

A szintaxis a következő:

$Using:<VariableName>

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

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

A hatókör használata a PowerShell 3,0-ben lett bevezetve. A PowerShell 2,0-ben azt jelzi, hogy egy változó a helyi munkamenetben lett létrehozva, a következő parancs formátumát használja.

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

Lásd még

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks