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 geen onbedoelde wijzigingen aanbrengt in items in andere bereiken.
Bereikregels
Wanneer u PowerShell start, maakt de host (pwsh.exe) een PowerShell-runspace.
Hostprocessen kunnen meerdere runspaces hebben. Elke runspace heeft een eigen sessiestatus en scopecontainers. De sessie-status en scopes zijn niet toegankelijk voor runspace-omgevingen.
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 binnen het bereik waarin het is gemaakt en in alle onderliggende bereiken, tenzij u het expliciet privé maakt.
- Met bereikaanpassingen kunt u variabelen, aliassen, functies en PowerShell-stations declareren voor 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.
- Wanneer code die wordt uitgevoerd in een runspace verwijst naar een item, probeert PowerShell de scope-hiërarchie te doorzoeken, te beginnen met de huidige scope en verdergaat naar elke bovenliggende scope.
- Als het item niet wordt gevonden, wordt er een nieuw item gemaakt in het huidige bereik.
- Als er een overeenkomst wordt gevonden, wordt de waarde van het item opgehaald uit het bereik waar het is gevonden.
- Als u de waarde wijzigt, wordt het item gekopieerd naar het huidige bereik, zodat de wijziging alleen van invloed is op het huidige bereik.
- Als u expliciet een item maakt dat de naam deelt met een item in een andere scope, wordt het oorspronkelijke item mogelijk verborgen door het nieuwe item, maar het wordt niet overschreven of aangepast.
Bovenliggende en onderliggende bereiken
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.
Notitie
Functies uit een module worden niet uitgevoerd in een onderliggend bereik van het aanroepende bereik. Modules hebben hun eigen sessiestatus die is gekoppeld aan het bereik waarin de module is geïmporteerd. Alle modulecode wordt uitgevoerd in een modulespecifieke hiërarchie van bereiken die een eigen hoofdhiërarchie van bereiken heeft. Zie de sectie Modules van dit artikel voor meer informatie.
Wanneer een onderliggende scope wordt gemaakt, bevat deze alle aliassen en variabelen met de optie AllScope en enkele automatische variabelen. Deze optie wordt verderop in dit artikel besproken.
Tenzij u de items expliciet privé maakt, zijn de items in de parent scope beschikbaar voor de child scope. Items die u in een kindbereik maakt of wijzigt, hebben geen invloed op het ouderbereik, tenzij u expliciet het bereik opgeeft wanneer u de items aanmaakt.
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
Wanneer een verwijzing naar een variabele, alias of functie wordt gemaakt, zoekt PowerShell naar het huidige bereik. Als het item niet wordt gevonden, wordt het bovenliggende bereik doorzocht. Deze zoekopdracht wordt herhaald tot aan het wereldwijde bereik. Als een variabele privé is in een bovenliggend bereik, wordt de zoekopdracht voortgezet via de bereikketen. Voorbeeld 4 toont het effect van een privévariabele in een scope-zoekopdracht.
Namen van PowerShell-bereiken
PowerShell definieert namen voor sommige bereiken om eenvoudiger toegang tot die bereiken mogelijk te maken. PowerShell definieert de volgende benoemde bereiken:
- Globale: het bereik dat actief is wanneer PowerShell wordt gestart of wanneer u een nieuwe sessie of runspace maakt. Variabelen en functies die aanwezig zijn wanneer PowerShell wordt gestart, zoals automatische variabelen en voorkeursvariabelen, worden gemaakt in het globale bereik. De variabelen, aliassen en functies in uw PowerShell-profielen worden ook in de globale scope aangemaakt. Het globale bereik is het bovenliggende hoofdbereik in een runspace.
- Lokale: 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. De opdrachten in het script draaien binnen het scriptbereik. Voor de opdrachten in een script is het scriptbereik het lokale bereik.
Voor cmdlets die scopes ondersteunen, kan naar scopes worden verwezen door een getal dat de relatieve positie van het ene scope ten opzichte van het andere beschrijft. Scope 0 geeft het huidige (lokale) bereik aan, bereik 1 is het bovenliggende bereik van het huidige bereik, bereik 2 is de grootouder van het huidige bereik. Dit patroon gaat door totdat u het wortelbereik bereikt.
Bereikaanpassingen
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. Wanneer u deLocal:bereikaanpassing gebruikt, zoekt PowerShell niet in bovenliggende bereiken. Als het item in het huidige bereik bestaat, wordt het gebruikt. Als het item niet in het huidige bereik bestaat, maakt PowerShell een nieuw item in het huidige bereik.Private:- Hiermee geeft u op dat de naam privé- is en alleen zichtbaar is voor het huidige bereik.Notitie
Private:is geen scope. Het is een optie die de toegankelijkheid van een item buiten het bereik wijzigt waarin het is gedefinieerd.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 voor toegang tot variabelen die zijn gedefinieerd in een andere scope tijdens uitvoering in externe sessies, achtergrondtaken of draadprocessen.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 wijzigingsfunctie die is gemaakt door een PowerShell-PSDrive-provider. Bijvoorbeeld: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 zijn gedefinieerd in een script.
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 bereikaanpassing gebruikt, maakt u een variabele 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"
Get-Variable a | Format-List *
Let op de eigenschapswaarden Zichtbaarheid en Options.
Name : a
Description :
Value : one
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
Vergelijk dit met een privévariabele:
$Private:pVar = 'Private variable'
Get-Variable pVar | Format-List *
Met de Private: bereikaanpassing stelt u de eigenschap Options in op Private.
Name : pVar
Description :
Value : Private variable
Visibility : Public
Module :
ModuleName :
Options : Private
Attributes : {}
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 is geïntroduceerd in PowerShell 3.0.
Voor elke script of opdracht die buiten de actieve sessie wordt uitgevoerd, hebt u de Using: bereikaanpassing nodig om variabele waarden uit de aanroepende sessieomgeving in te sluiten, zodat code buiten de sessie toegang 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, gestart met
Start-Job(out-of-process-sessie) - 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.
Een $Using: verwijzing wordt alleen uitgebreid naar de waarde van een variabele. Als u de waarde van een variabele in het bereik van de aanroeper wilt wijzigen, moet u een verwijzing naar de variabele zelf hebben. U kunt een verwijzing naar een variabele maken door de PSVariable exemplaar van de variabele op te halen. In het volgende voorbeeld ziet u hoe u een verwijzing maakt en wijzigingen aanbrengt in een draadtaak.
$Count = 1
$refOfCount = Get-Variable Count
Start-ThreadJob {
($Using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob
$Count
2
Notitie
Dit is geen threadveilige bewerking. U kunt beschadiging van gegevens veroorzaken als u de waarde van meerdere threads tegelijk probeert te wijzigen. U moet threadveilige gegevenstypen of synchronisatieprimitief gebruiken om gedeelde gegevens te beveiligen. Zie Thread-Safe verzamelingenvoor 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 eenvoudige typen, zoals System.Version, is de kopie exact. 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 gedeserialiseerde, 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 subscopes die u maakt, hoewel ze niet retroactief worden overgenomen door bovenscopes.
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.
Omvang 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 cmdlet Get-Item heeft geen parameter Scope.
Notitie
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.
Dot-source notatie met bereik gebruiken
Scripts en functies volgen de 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 de inhoud van een script of functie toevoegen aan het huidige bereik met behulp van puntbron notatie. Wanneer u een script of functie uitvoert met behulp van dot-source-annotatie, wordt het uitgevoerd in de huidige scope. Alle functies, aliassen en variabelen in het script of de functie worden toegevoegd aan het huidige bereik.
Als u bijvoorbeeld het Sample.ps1 script wilt uitvoeren vanuit de map C:\Scripts in het scriptbereik (de standaardinstelling voor scripts), hoeft u alleen het volledige pad naar het scriptbestand op de opdrachtregel in te voeren.
C:\scripts\sample.ps1
Een scriptbestand moet een .ps1 bestandsextensie hebben om uitvoerbaar te zijn. Bestanden met spaties in hun pad moeten tussen aanhalingstekens staan. Als u probeert het aangehaalde pad uit te voeren, geeft PowerShell de inhoud van de aangehaalde tekenreeks weer in plaats van dat het script wordt uitgevoerd. Met de aanroepoperator (&) kunt u de inhoud van de tekenreeks met de bestandsnaam uitvoeren.
Door de aanroepoperator te gebruiken om een functie of script uit te voeren, wordt de functie of het script uitgevoerd in het scriptbereik. Het gebruik van de aanroepoperator verschilt niet van het uitvoeren van het script op naam.
& C:\scripts\sample.ps1
Meer informatie over de oproepoperator vindt u in about_Operators.
Als u het Sample.ps1-script in het lokale bereik wilt uitvoeren, typt u een punt en een spatie (. ) vóór het pad naar het script:
. C:\scripts\sample.ps1
Nu worden alle functies, aliassen of variabelen die in het script zijn gedefinieerd, toegevoegd aan het huidige bereik.
Beperken zonder bereik
PowerShell heeft enkele opties en functies die vergelijkbaar zijn met het bereik en die met bereiken kunnen interageren. Deze functie kan worden verward met de reikwijdte of het gedrag van de reikwijdte.
Sessies, modules en geneste prompts zijn zelfstandige omgevingen, geen onderliggende scopes van de globale scope 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.
Modules
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 de items in een module expliciet worden geëxporteerd (met behulp van Export-ModuleMember of het modulemanifest), 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.
Modules worden standaard geladen in de globale root-scope van de runspace. Als u een module importeert, wordt het bereik niet gewijzigd.
Binnen de sessie hebben modules hun eigen bereik. 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
Modules maken parallelle bereikcontainers die zijn gekoppeld aan het bereik waarin ze zijn geïmporteerd. Items die door de module worden geëxporteerd, zijn beschikbaar vanaf het bereikniveau waarin ze worden geïmporteerd. Items die niet uit de module worden geëxporteerd, zijn alleen beschikbaar in de bereikcontainer van de module. Functies in de module hebben toegang tot items in het bereik waarin ze zijn geïmporteerd, evenals items in de bereikcontainer van de module.
Als u Module2- laadt vanuit binnenModule1, wordt Module2- in de bereikcontainer van Module1 geladen. Alle exports van Module2 worden in het huidige modulebereik van Module1geplaatst. Als u Import-Module -Scope Localgebruikt, worden de exports in het huidige bereikobject geplaatst in plaats van op het hoogste niveau. Als u in een module en een andere module laadt met behulp van Import-Module -Scope Global (of Import-Module -Global), worden die module en de bijbehorende exports in het globale bereik geladen in plaats van het lokale bereik van de module.
De functie WindowsCompatibility doet dit om proxymodules in de globale sessiestatus te importeren.
Geneste prompts
Geneste prompts hebben geen eigen afgebakend 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 Option die een waarde van Privatekan aannemen. Items met de optie Private kunnen worden bekeken en gewijzigd in het bereik waarin ze worden gemaakt, maar ze kunnen niet buiten dat bereik worden weergegeven of gewijzigd.
Als u bijvoorbeeld een variabele maakt die een privéoptie heeft in het globale bereik en vervolgens een script uitvoert, Get-Variable opdrachten in het script de privévariabele niet weergeven. Als u de Global: bereikaanpassing in dit exemplaar gebruikt, wordt de privévariabele niet weergegeven.
U kunt de parameter Option van de New-Variable, Set-Variable, New-Aliasen Set-Alias cmdlets gebruiken om de waarde van de eigenschap Option 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 wijze zoals de eigenschap waarde Private van de optie is ontworpen voor scopes.
De eigenschap Zichtbaarheid neemt de waarden Public en Private aan. 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 met persoonlijke zichtbaarheid niet worden weergegeven of gewijzigd.
Omdat zichtbaarheid is ontworpen voor containers, werkt deze anders in een bereik.
- Als u een item maakt met persoonlijke zichtbaarheid in de globale scope, kunt u het item in geen enkele scope 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: Een variabelewaarde alleen wijzigen in een script
Met de volgende opdracht wordt de waarde van de variabele $ConfirmPreference in een script gewijzigd. De wijziging heeft geen invloed op het globale bereik.
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 niet van invloed zijn op de waarde van de variabele in het bovenliggende bereik.
Voorbeeld 2: Een variabelewaarde in verschillende contexten weergeven
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 ongeveer 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 beschermt met de optie Privé of een andere methode, kunt u in een ouder-scope de waarde van een variabele 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 variabele kan privé worden gemaakt met behulp van de Private: bereikaanpassing of door de variabele te maken met de eigenschap Option ingesteld op Private. Privévariabelen kunnen alleen worden weergegeven of gewijzigd in het bereik waarin ze zijn gemaakt.
In dit voorbeeld maakt het ScopeExample.ps1 script vijf functies. De eerste functie roept de volgende functie aan, die een kinderbereik creëert. Een van de functies heeft een privévariabele die alleen kan worden weergegeven in het bereik waarin deze is gemaakt.
PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
"Setting `$funcAVar1 to 'Value set in funcA'"
$funcAVar1 = "Value set in funcA"
funcB
}
function funcB {
"In funcB before set -> '$funcAVar1'"
$Private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
"In funcB after set -> '$funcAVar1'"
funcC
}
function funcC {
"In funcC before set -> '$funcAVar1' - should be the value set in funcA"
$funcAVar1 = "Value set in funcC - Child scopes can see this change."
"In funcC after set -> '$funcAVar1'"
funcD
}
function funcD {
"In funcD before set -> '$funcAVar1' - should be the value from funcC."
$funcAVar1 = "Value set in funcD"
"In funcD after set -> '$funcAVar1'"
'-------------------'
ShowScopes
}
function ShowScopes {
$funcAVar1 = "Value set in ShowScopes"
"Scope [0] (local) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
"Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
"Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
"Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
"Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1
De uitvoer toont de waarde van de variabele in elk bereik. U kunt zien dat de privévariabele alleen zichtbaar is in funcB, het bereik waarin deze is gemaakt.
Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set -> 'Value set in funcD'
-------------------
Scope [0] (local) $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'
Zoals wordt weergegeven in de uitvoer van ShowScopes, hebt u toegang tot variabelen uit andere scopes met behulp van Get-Variable en door een scope nummer op te geven.
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 syntaxis is:
$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}
De Using: bereikaanpassing is geïntroduceerd in PowerShell 3.0.