Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Korte beschrijving
Legt het concept van het bereik in PowerShell uit en laat zien hoe u het bereik van elementen instelt en wijzigt.
Lange beschrijving
PowerShell beschermt de toegang tot variabelen, aliassen, functies en PowerShell-stations (PSDrives) door te beperken waar ze kunnen worden gelezen en gewijzigd. PowerShell maakt gebruik van bereikregels om ervoor te zorgen dat u niet per ongeluk een item wijzigt dat niet mag worden gewijzigd.
Hier volgen de basisregels voor de reikwijdte:
Bereiken kunnen nesten. Een buitenste bereik wordt een bovenliggend bereik genoemd. Geneste bereiken zijn onderliggende bereiken van dat bovenliggende bereik.
Een item is zichtbaar in het bereik waarin het is gemaakt en in eventuele onderliggende scopes, tenzij u het expliciet privé maakt.
U kunt variabelen, aliassen, functies en PowerShell-stations declareren in een bereik buiten het huidige bereik.
Een item dat u in een bereik hebt gemaakt, kan alleen worden gewijzigd in het bereik waarin het is gemaakt, tenzij u expliciet een ander bereik opgeeft.
Als u een item in een bereik maakt en de naam van het item wordt gedeeld met een item in een ander bereik, wordt het oorspronkelijke item mogelijk verborgen onder het nieuwe item, maar wordt het niet overschreven of gewijzigd.
PowerShell-scopes
PowerShell ondersteunt de volgende bereiken:
Globaal: het bereik dat van kracht is wanneer PowerShell wordt gestart of wanneer u een nieuwe sessie of runspace maakt. Variabelen en functies die aanwezig zijn wanneer PowerShell wordt gestart, zijn gemaakt in het globale bereik, zoals automatische variabelen en voorkeursvariabelen. De variabelen, aliassen en functies in uw PowerShell-profielen worden ook in de globale scope aangemaakt. Het globale bereik is het hoofdbovenliggende bereik in een sessie.
Lokaal: De huidige reikwijdte. Het lokale bereik kan het globale bereik of een ander bereik zijn.
Script: het bereik dat wordt gemaakt terwijl een scriptbestand wordt uitgevoerd. Alleen de opdrachten in het script worden uitgevoerd in het scriptbereik. Voor de opdrachten in een script is het scriptbereik het lokale bereik.
Opmerking
Privé is geen scope. Het is een optie die de zichtbaarheid van een item wijzigt buiten het bereik waarin het item is gedefinieerd.
Bovenliggende en onderliggende scopes
U kunt een nieuw subscope maken door een script of functie uit te voeren. Het aanroepende bereik is het bovenliggende bereik. Het aangeroepen script of de functie is het kindbereik. De functies of scripts die u aanroept, kunnen andere functies aanroepen, waardoor een hiërarchie wordt gemaakt van onderliggende bereiken waarvan het hoofdbereik het globale bereik is.
Tenzij u de items expliciet privé maakt, zijn de items in de parent scope beschikbaar voor de child scope. Items die u maakt en wijzigt in het onderliggende bereik, hebben echter geen invloed op het bovenliggende bereik, tenzij u het bereik expliciet opgeeft wanneer u de items maakt.
Opmerking
Functies van een module worden niet uitgevoerd in een onderliggend bereik van het aanroepende bereik. Modules hebben een eigen sessiestatus die is gekoppeld aan de globale scope. Alle modulecode wordt uitgevoerd in een modulespecifieke hiërarchie van bereiken die een eigen hoofdhiërarchie van bereiken heeft.
Erfenis
Een onderliggend bereik neemt de variabelen, aliassen en functies niet over van het bovenliggende bereik. Tenzij een item privé is, kan het onderliggende bereik de items in het bovenliggende bereik bekijken. En het kan de items wijzigen door het bovenliggende bereik expliciet op te geven, maar de items maken geen deel uit van het onderliggende bereik.
Er wordt echter een child-scope gemaakt met een set items. Meestal bevat het alle aliassen die de AllScope-optie hebben. Deze optie wordt verderop in dit artikel besproken. Het bevat alle variabelen die de AllScope-optie hebben, plus enkele automatische variabelen.
Gebruik de parameter Bereik van Get-Variable of Get-Aliasom de items in een bepaald bereik te vinden.
Als u bijvoorbeeld alle variabelen in het lokale bereik wilt ophalen, typt u:
Get-Variable -Scope local
Als u alle variabelen in het globale bereik wilt ophalen, typt u:
Get-Variable -Scope global
Toepassingsgebied modificatoren
Een variabele, alias of functienaam kan een van de volgende optionele bereikaanpassingen bevatten:
global:- Hiermee wordt aangegeven dat de naam bestaat in de global scope.local:- Hiermee wordt gespecificeerd dat de naam bestaat in het lokale bereik . Het huidige bereik is altijd het Lokale bereik.private:- Hiermee geeft u op dat de naam privé- is en alleen zichtbaar is voor het huidige bereik.script:- Geeft aan dat de naam bestaat binnen de Script scope. Script scope is het bereik van het dichtstbijzijnde bovenliggende scriptbestand of Global als er geen dichtstbijzijnde bovenliggende scriptbestand is.using:- Wordt gebruikt om toegang te krijgen tot variabelen die in een ander bereik zijn gedefinieerd tijdens het uitvoeren van scripts via cmdlets zoalsStart-JobenInvoke-Command.workflow:- Hiermee geeft u op dat de naam bestaat binnen een werkstroom. Opmerking: Werkstromen worden niet ondersteund in PowerShell v6 en hoger.<variable-namespace>- Een modifier die is gemaakt door een PowerShell PSDrive-provider. Voorbeeld:Namespace Beschrijving Alias:Aliassen die zijn gedefinieerd in de huidige context Env:Omgevingsvariabelen gedefinieerd binnen de huidige scope Function:Functies die zijn gedefinieerd in het huidige bereik Variable:Variabelen die zijn gedefinieerd in het huidige bereik
Het standaardbereik voor scripts is het scriptbereik. Het standaardbereik voor functies en aliassen is het lokale bereik, zelfs als ze in een script zijn gedefinieerd.
Modificators voor bereik gebruiken
Als u het bereik van een nieuwe variabele, alias of functie wilt opgeven, gebruikt u een bereikaanpassingsfunctie.
De syntaxis voor een bereikaanpassing in een variabele is:
$[<scope-modifier>:]<name> = <value>
De syntaxis voor een bereikaanpassing in een functie is:
function [<scope-modifier>:]<name> {<function-body>}
Met de volgende opdracht, die geen gebruikmaakt van een bereikwijzigingsfunctie, wordt een variabele gemaakt in het huidige of lokale bereik:
$a = "one"
Als u dezelfde variabele wilt maken in het globale bereik, gebruikt u de wijzigingsfunctie voor het bereik global::
$global:a = "one"
Als u dezelfde variabele wilt maken in het scriptbereik, gebruikt u de script: scope-modificator.
$script:a = "one"
U kunt ook een bereikaanpassing met functies gebruiken. Met de volgende functiedefinitie maakt u een functie in het globale bereik:
function global:Hello {
Write-Host "Hello, World"
}
U kunt ook bereikaanpassingen gebruiken om te verwijzen naar een variabele in een ander bereik.
De volgende opdracht verwijst naar de variabele $test, eerst in het lokale bereik en vervolgens in het globale bereik:
$test
$global:test
De Using: bereikmodifier
Using is een speciale bereikmodifier die een lokale variabele in een opdracht op afstand identificeert. Zonder een wijzigingsfunctie verwacht PowerShell dat variabelen in externe opdrachten worden gedefinieerd in de externe sessie.
De Using bereikaanpassing wordt geïntroduceerd in PowerShell 3.0.
Voor elk script of commando dat buiten de sessie wordt uitgevoerd, hebt u de Using bereikaanpassing nodig om variabele waarden vanuit het aanroepende sessiebereik in te sluiten, zodat code buiten de sessie hier toegang toe heeft. De Using bereikaanpassing wordt ondersteund in de volgende contexten:
- Op afstand uitgevoerde opdrachten, gestart met
Invoke-Commandmet behulp van de ComputerName, HostName, SSHConnection of Session parameters (externe sessie) - Achtergrondtaken die gestart zijn met
Start-Job(sessie buiten het proces) - Thread-taken, uitgevoerd met
Start-ThreadJobofForEach-Object -Parallel(aparte threadsessie)
Afhankelijk van de context zijn ingesloten variabelewaarden onafhankelijke kopieën van de gegevens in het bereik van de beller of verwijzingen ernaar. In externe en buiten-proces sessies zijn ze altijd onafhankelijke kopieën.
Zie about_Remote_Variablesvoor meer informatie.
In thread-sessies worden ze doorgegeven via verwijzing. Dit betekent dat het mogelijk is om call scope-variabelen in een andere thread te wijzigen. Om variabelen veilig te wijzigen, is threadsynchronisatie vereist.
Zie voor meer informatie:
Serialisatie van variabele waarden
Op afstand uitgevoerde opdrachten en achtergrondtaken worden buiten het hoofdproces uitgevoerd. Out-of-process sessies maken gebruik van op XML gebaseerde serialisatie en deserialisatie om de waarden van variabelen beschikbaar te maken binnen de procesgrenzen. Het serialisatieproces converteert objecten naar een PSObject- die de oorspronkelijke objecteigenschappen bevat, maar niet naar de bijbehorende methoden.
Voor een beperkte set typen rehydrateeert deserialisatie objecten terug naar het oorspronkelijke type. Het gerehydrateerde object is een kopie van het oorspronkelijke objectexemplaar. Het heeft de typeeigenschappen en -methoden. Voor simpele types, zoals System.Version, is de kopie precies. Voor complexe typen is de kopie onvolmaakt. Gerehydrateerde certificaatobjecten bevatten bijvoorbeeld niet de persoonlijke sleutel.
Instanties van alle andere typen zijn PSObject instanties. De eigenschap PSTypeNames bevat de oorspronkelijke typenaam voorafgegaan door Deserialized, bijvoorbeeld Deserialized.System.Data.DataTable
De optie AllScope
Variabelen en aliassen hebben een eigenschap Option die een waarde van AllScope-kan aannemen. Items met de eigenschap AllScope worden onderdeel van alle onderliggende bereiken die u maakt, hoewel ze niet met terugwerkende kracht worden overgenomen door bovenliggende bereiken.
Een item met de eigenschap AllScope is zichtbaar in het onderliggende bereik en maakt deel uit van dat bereik. Wijzigingen in het item in een bereik zijn van invloed op alle bereiken waarin de variabele is gedefinieerd.
Bereik beheren
Verschillende cmdlets hebben een bereikparameter waarmee u items in een bepaald bereik kunt ophalen of instellen (maken en wijzigen). Gebruik de volgende opdracht om alle cmdlets in uw sessie te vinden met een parameter Bereik:
Get-Help * -Parameter scope
Gebruik de parameter Scope van Get-Variableom de variabelen te vinden die zichtbaar zijn in een bepaald bereik. De zichtbare variabelen omvatten globale variabelen, variabelen in de bovenliggende scope en variabelen in de huidige scope.
Met de volgende opdracht worden bijvoorbeeld de variabelen opgeslagen die zichtbaar zijn in het lokale bereik:
Get-Variable -Scope local
Als u een variabele in een bepaald bereik wilt maken, gebruikt u een bereikaanpassingsfunctie of de parameter Bereik van Set-Variable. Met de volgende opdracht maakt u een variabele in het globale bereik:
New-Variable -Scope global -Name a -Value "One"
U kunt ook de bereikparameter van de New-Alias, Set-Aliasof Get-Alias cmdlets gebruiken om het bereik op te geven. Met de volgende opdracht maakt u een alias in het globale bereik:
New-Alias -Scope global -Name np -Value Notepad.exe
Als u de functies in een bepaald bereik wilt ophalen, gebruikt u de cmdlet Get-Item wanneer u zich in het bereik bevindt. De Get-Item cmdlet heeft geen Scope-parameter .
Opmerking
Voor de cmdlets die gebruikmaken van de parameter Bereik, kunt u ook verwijzen naar bereiken op getal. Het getal beschrijft de relatieve positie van het ene bereik naar het andere. Bereik 0 vertegenwoordigt het huidige of lokale bereik. Bereik 1 geeft het directe bovenliggende bereik aan. Bereik 2 geeft het bovenliggende bereik aan, enzovoort. Genummerde bereiken zijn handig als u veel recursieve bereiken hebt gemaakt.
Puntbronnotatie gebruiken met bereik
Scripts en functies volgen alle regels van het toepassingsgebied. U maakt ze in een bepaald bereik en ze hebben alleen invloed op dat bereik, tenzij u een cmdlet-parameter of een bereikwijziging gebruikt om dat bereik te wijzigen.
U kunt echter een script of functie toevoegen aan het huidige bereik met behulp van de puntbronnotatie. Wanneer een script vervolgens in het huidige bereik wordt uitgevoerd, zijn alle functies, aliassen en variabelen die door het script worden gemaakt, beschikbaar in het huidige bereik.
Als u een functie aan het huidige bereik wilt toevoegen, typt u een punt (.) en een spatie voor het pad en de naam van de functie in de functieaanroep.
Als u bijvoorbeeld het Sample.ps1-script wilt uitvoeren vanuit de map C:\Scripts in het scriptbereik (de standaardinstelling voor scripts), gebruikt u de volgende opdracht:
c:\scripts\sample.ps1
Gebruik de volgende opdracht om het Sample.ps1 script in het lokale bereik uit te voeren:
. c:\scripts.sample.ps1
Wanneer u de aanroepoperator (&) gebruikt om een functie of script uit te voeren, wordt deze niet toegevoegd aan het huidige bereik. In het volgende voorbeeld wordt de aanroepoperator gebruikt:
& c:\scripts.sample.ps1
U kunt meer lezen over de calloperator in about_operators.
Aliassen, functies of variabelen die door het Sample.ps1-script worden gemaakt, zijn niet beschikbaar in het huidige bereik.
Beperken zonder reikwijdte
Een paar PowerShell-concepten zijn vergelijkbaar met bereik of interageren met bereik. Deze concepten kunnen worden verward met reikwijdte of het gedrag van bereik.
Sessies, modules en geneste prompts zijn op zichzelf staande omgevingen, maar het zijn geen onderliggende bereiken van het globale bereik in de sessie.
Sessies
Een sessie is een omgeving waarin PowerShell wordt uitgevoerd. Wanneer u een sessie maakt op een externe computer, brengt PowerShell een permanente verbinding tot stand met de externe computer. Met de permanente verbinding kunt u de sessie gebruiken voor meerdere gerelateerde opdrachten.
Omdat een sessie een ingesloten omgeving is, heeft deze een eigen bereik, maar is een sessie geen onderliggend bereik van de sessie waarin deze is gemaakt. De sessie begint met een eigen globaal bereik. Dit bereik is onafhankelijk van het globale bereik van de sessie. U kunt deelscopes maken in de sessie. U kunt bijvoorbeeld een script uitvoeren om een kindbereik in een sessie te maken.
Modulen
U kunt een PowerShell-module gebruiken om PowerShell-hulpprogramma's te delen en te leveren. Een module is een eenheid die cmdlets, scripts, functies, variabelen, aliassen en andere nuttige items kan bevatten. Tenzij expliciet gedefinieerd, zijn de items in een module niet toegankelijk buiten de module. Daarom kunt u de module toevoegen aan uw sessie en de openbare items gebruiken zonder dat u zich zorgen hoeft te maken dat de andere items de cmdlets, scripts, functies en andere items in uw sessie kunnen overschrijven.
Standaard worden modules geladen in het hoogste niveau van de huidige sessiestatus , niet in het huidige bereik. De huidige sessiestatus kan een modulesessiestatus of de globale sessiestatus zijn. Het toevoegen van een module aan een sessie verandert niets aan het bereik. Als u zich in het globale bereik bevindt, worden modules in de globale sessiestatus geladen. Eventuele exportproducten worden in de globale tabellen geplaatst.
Als u module2 laadt vanuit module 1, wordt module2 geladen in de sessiestatus van module1 en niet in de algemene sessiestatus. Eventuele exports van module2 worden boven aan de sessiestatus van module1 geplaatst. Als u Import-Module -Scope localgebruikt, worden de exports in het huidige bereikobject geplaatst in plaats van op het hoogste niveau. Als u zich in een module bevindt en (of Import-Module -Scope global) gebruikt Import-Module -Global om een andere module te laden, worden die module en de exports geladen in de algemene sessiestatus in plaats van in de lokale sessiestatus van de module. Deze functie is ontworpen voor het schrijven van modules die modules manipuleren. De WindowsComatibility-module doet dit om proxymodules te importeren in de globale sessiestatus.
Binnen de sessiestatus hebben modules hun eigen reikwijdte. Houd rekening met de volgende module C:\temp\mod1.psm1:
$a = "Hello"
function foo {
"`$a = $a"
"`$global:a = $global:a"
}
Nu maken we een globale variabele $a, geven we deze een waarde en roepen we de functie aan foo-.
$a = "Goodbye"
foo
De module declareert de variabele $a in het modulebereik, waarna de functie foo de waarde van de variabele in beide bereiken uitvoert.
$a = Hello
$global:a = Goodbye
Geneste prompts
Geneste prompts hebben geen eigen bereik. Wanneer u een geneste prompt invoert, is de geneste prompt een subset van de omgeving. Maar u blijft binnen het lokale bereik.
Scripts hebben hun eigen reikwijdte. Als u fouten in een script opspoort en u een onderbrekingspunt in het script bereikt, voert u het scriptbereik in.
Privé optie
Aliassen en variabelen hebben een eigenschap Optie die de waarde Privé kan hebben. Items met de optie Privé kunnen worden weergegeven en gewijzigd in het bereik waarin ze zijn gemaakt, maar ze kunnen niet buiten dat bereik worden weergegeven of gewijzigd.
Als u bijvoorbeeld een variabele maakt met een privéoptie in het algemene bereik en vervolgens een script uitvoert, Get-Variable wordt de privévariabele niet weergegeven in opdrachten in het script. Als u in dit geval de globale bereikmodifier gebruikt, wordt de privévariabele niet weergegeven.
U kunt de parameter Optie van de New-Variable, Set-Variable, New-Aliasen Set-Alias cmdlets gebruiken om de waarde van de eigenschap Optie in te stellen op Privé.
Zichtbaarheid
De eigenschap Zichtbaarheid van een variabele of alias bepaalt of u het item buiten de container kunt zien, waarin het is gemaakt. Een container kan een module, script of snap-in zijn. Zichtbaarheid is ontworpen voor containers op dezelfde manier als de privéwaarde van de eigenschap Option is ontworpen voor scopes.
Het Visibility-pand neemt de publieke en private waarden over. Items met persoonlijke zichtbaarheid kunnen alleen worden bekeken en gewijzigd in de container waarin ze zijn gemaakt. Als de container wordt toegevoegd of geïmporteerd, kunnen de items die privé zichtbaar zijn, niet worden bekeken of gewijzigd.
Omdat zichtbaarheid is ontworpen voor containers, werkt deze anders in een bereik.
- Als u een item maakt dat privézichtbaarheid heeft in het algemene bereik, kunt u het item in geen enkel bereik weergeven of wijzigen.
- Als u de waarde van een variabele met persoonlijke zichtbaarheid probeert weer te geven of te wijzigen, retourneert PowerShell een foutbericht.
U kunt de cmdlets New-Variable en Set-Variable gebruiken om een variabele te maken met persoonlijke zichtbaarheid.
Voorbeelden
Voorbeeld 1: Wijzig de waarde van een variabele alleen in een script
Met de volgende opdracht wordt de waarde van de variabele $ConfirmPreference in een script gewijzigd. De wijziging heeft geen invloed op de wereldwijde reikwijdte.
Gebruik eerst de volgende opdracht om de waarde van de $ConfirmPreference variabele in het lokale bereik weer te geven:
PS> $ConfirmPreference
High
Maak een Scope.ps1 script met de volgende opdrachten:
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
Voer het script uit. Het script wijzigt de waarde van de $ConfirmPreference variabele en rapporteert vervolgens de waarde ervan in het scriptbereik. De uitvoer moet er ongeveer uitzien als de volgende uitvoer:
The value of $ConfirmPreference is Low.
Test vervolgens de huidige waarde van de variabele $ConfirmPreference in het huidige bereik.
PS> $ConfirmPreference
High
In dit voorbeeld ziet u dat wijzigingen in de waarde van een variabele in het scriptbereik geen invloed hebben op de waarde van de variabele in het bovenliggende bereik.
Voorbeeld 2: Een variabele weergeven in verschillende bereiken
U kunt bereikaanpassingen gebruiken om de waarde van een variabele in het lokale bereik en in een bovenliggend bereik weer te geven.
Definieer eerst een $test variabele in het globale bereik.
$test = "Global"
Maak vervolgens een Sample.ps1 script dat de $test variabele definieert. Gebruik in het script een bereikaanpassing om te verwijzen naar de globale of lokale versies van de variabele $test.
In Sample.ps1:
$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."
Wanneer u Sample.ps1uitvoert, moet de uitvoer er als volgt uitzien:
The local value of $test is Local.
The global value of $test is Global.
Wanneer het script is voltooid, wordt alleen de globale waarde van $test gedefinieerd in de sessie.
PS> $test
Global
Voorbeeld 3: De waarde van een variabele in een bovenliggend bereik wijzigen
Tenzij u een item beveiligt met behulp van de optie Privé of een andere methode, kunt u de waarde van een variabele in een bovenliggend bereik weergeven en wijzigen.
Definieer eerst een $test variabele in het globale bereik.
$test = "Global"
Maak vervolgens een Sample.ps1 script dat de $test variabele definieert. Gebruik in het script een bereikaanpassing om te verwijzen naar de globale of lokale versies van de variabele $test.
In Sample.ps1:
$global:test = "Local"
"The global value of `$test is $global:test."
Wanneer het script is voltooid, wordt de globale waarde van $test gewijzigd.
PS> $test
Local
Voorbeeld 4: Een privévariabele maken
Een privévariabele is een variabele met een optie-eigenschap met de waarde Privé. Privévariabelen worden overgenomen door het onderliggende bereik, maar ze kunnen alleen worden weergegeven of gewijzigd in het bereik waarin ze zijn gemaakt.
Met de volgende opdracht wordt een privévariabele gemaakt die wordt aangeroepen $ptest in het lokale bereik.
New-Variable -Name ptest -Value 1 -Option private
U kunt de waarde van $ptest weergeven en wijzigen in het lokale bereik.
PS> $ptest
1
PS> $ptest = 2
PS> $ptest
2
Maak vervolgens een Sample.ps1 script dat de volgende opdrachten bevat. De opdracht probeert de waarde van $ptestweer te geven en te wijzigen.
In Sample.ps1:
"The value of `$Ptest is $Ptest."
"The value of `$Ptest is $global:Ptest."
De $ptest variabele is niet zichtbaar in het scriptbereik, de uitvoer is leeg.
"The value of $Ptest is ."
"The value of $Ptest is ."
Voorbeeld 5: Een lokale variabele gebruiken in een externe opdracht
Gebruik de Using bereikaanpassing voor variabelen in een externe opdracht die is gemaakt in de lokale sessie. PowerShell gaat ervan uit dat de variabelen in externe opdrachten zijn gemaakt in de externe sessie.
De structuur is als volgt:
$Using:<VariableName>
Met de volgende opdrachten maakt u bijvoorbeeld een $Cred variabele in de lokale sessie en gebruikt u vervolgens de variabele $Cred in een externe opdracht:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}
Het bereik Gebruik is geïntroduceerd in PowerShell 3.0. Als u in PowerShell 2.0 wilt aangeven dat er een variabele is gemaakt in de lokale sessie, gebruikt u de volgende opdrachtindeling.
$Cred = Get-Credential
Invoke-Command $s {
param($c)
Remove-Item .\Test*.ps1 -Credential $c
} -ArgumentList $Cred