about_Scopes
Kort beskrivning
Förklarar begreppet omfång i PowerShell och visar hur du anger och ändrar omfånget för element.
Lång beskrivning
PowerShell skyddar åtkomsten till variabler, alias, funktioner och PowerShell-enheter (PSDrive) genom att begränsa var de kan läsas och ändras. PowerShell använder omfångsregler för att säkerställa att du inte gör oavsiktliga ändringar i objekt i andra omfång.
Omfångsregler
När du startar PowerShell skapar värden (pwsh.exe
) ett PowerShell-runspace.
Värdprocesser kan ha flera runspaces. Varje runspace har ett eget sessionstillstånd och omfångscontainrar. Sessionstillstånd och omfång kan inte nås över runspace-instanser.
Följande är de grundläggande omfångsreglerna:
- Omfång kan kapslas. Ett yttre omfång kallas för ett överordnat omfång. Alla kapslade omfång är underordnade omfång för den överordnade.
- Ett objekt visas i omfånget som det skapades och i eventuella underordnade omfång, såvida du inte uttryckligen gör det privat.
- Du kan deklarera variabler, alias, funktioner och PowerShell-enheter för ett omfång utanför det aktuella omfånget.
- Ett objekt som du skapade inom ett omfång kan bara ändras i omfånget där det skapades, såvida du inte uttryckligen anger ett annat omfång.
- När kod som körs i ett runspace refererar till ett objekt söker PowerShell igenom omfångshierarkin, börjar med det aktuella omfånget och fortsätter genom varje överordnat omfång.
- Om objektet inte hittas skapas ett nytt objekt i det aktuella omfånget.
- Om den hittar en matchning hämtas objektets värde från omfånget där det hittades.
- Om du ändrar värdet kopieras objektet till det aktuella omfånget så att ändringen endast påverkar det aktuella omfånget.
- Om du uttryckligen skapar ett objekt som delar dess namn med ett objekt i ett annat omfång kan det ursprungliga objektet döljas av det nya objektet, men det åsidosätts eller ändras inte.
Överordnade och underordnade omfång
Du kan skapa ett nytt underordnat omfång genom att anropa ett skript eller en funktion. Anropsomfånget är det överordnade omfånget. Det anropade skriptet eller funktionen är det underordnade omfånget. De funktioner eller skript som du anropar kan anropa andra funktioner och skapa en hierarki med underordnade omfång vars rotomfång är det globala omfånget.
Kommentar
Funktioner från en modul körs inte i ett underordnat omfång för anropsomfånget. Moduler har ett eget sessionstillstånd som är länkat till omfånget där modulen importerades. All modulkod körs i en modulspecifik hierarki med omfång som har ett eget rotomfång. Mer information finns i avsnittet Moduler i den här artikeln.
När ett underordnat omfång skapas innehåller det alla alias och variabler som har alternativet AllScope och vissa automatiska variabler. Det här alternativet beskrivs senare i den här artikeln.
Om du inte uttryckligen gör objekten privata är objekten i det överordnade omfånget tillgängliga för det underordnade omfånget. Objekt som du skapar eller ändrar i ett underordnat omfång påverkar inte det överordnade omfånget, såvida du inte uttryckligen anger omfånget när du skapar objekten.
Om du vill hitta objekten i ett visst omfång använder du parametern Get-Variable
Omfång för eller Get-Alias
.
Om du till exempel vill hämta alla variabler i det lokala omfånget skriver du:
Get-Variable -Scope local
Om du vill hämta alla variabler i det globala omfånget skriver du:
Get-Variable -Scope global
När en referens görs till en variabel, ett alias eller en funktion söker PowerShell i det aktuella omfånget. Om objektet inte hittas genomsöks det överordnade omfånget. Den här sökningen upprepas hela vägen upp till det globala omfånget. Om en variabel är privat i ett överordnat omfång fortsätter sökningen genom omfångskedjan. Exempel 4 visar effekten av en privat variabel i en omfångssökning.
Namn på PowerShell-omfång
PowerShell definierar namn för vissa omfång så att det blir enklare att komma åt det omfånget. PowerShell definierar följande namngivna omfång:
- Global: Omfånget som gäller när PowerShell startar eller när du skapar en ny session eller ett nytt runspace. Variabler och funktioner som finns när PowerShell startar, till exempel automatiska variabler och inställningsvariabler, skapas i det globala omfånget. Variabler, alias och funktioner i dina PowerShell-profiler skapas också i det globala omfånget. Det globala omfånget är rotens överordnade omfång i en runspace.
- Lokal: Det aktuella omfånget. Det lokala omfånget kan vara det globala omfånget eller något annat omfång.
- Skript: Omfånget som skapas när en skriptfil körs. Kommandona i skriptet körs i skriptomfånget. För kommandona i ett skript är skriptomfånget det lokala omfånget.
För cmdletar som stöder omfång kan omfång refereras till av ett tal som beskriver den relativa positionen för ett omfång till ett annat. Omfång 0 anger det aktuella (lokala) omfånget, omfång 1 är det aktuella omfångets överordnade omfång, omfång 2 är det aktuella omfångets mor- och farförälder. Det här mönstret fortsätter tills du når rotomfånget.
Omfångsmodifierare
En variabel, ett alias eller ett funktionsnamn kan innehålla någon av följande valfria omfångsmodifierare:
global:
– Anger att namnet finns i det globala omfånget.local:
– Anger att namnet finns i det lokala omfånget. Det aktuella omfånget är alltid det lokala omfånget.private:
– Anger att namnet är Privat och endast synligt för det aktuella omfånget.Kommentar
private:
är inte ett omfång. Det är ett alternativ som ändrar tillgängligheten för ett objekt utanför det omfång som det har definierats i.script:
– Anger att namnet finns i skriptomfånget. Skriptomfånget är den närmaste överordnade skriptfilens omfång eller Global om det inte finns någon närmaste överordnade skriptfil.using:
– Används för att komma åt variabler som definierats i ett annat omfång när de körs i fjärrsessioner, bakgrundsjobb eller trådjobb.workflow:
– Anger att namnet finns i ett arbetsflöde. Obs! Arbetsflöden stöds inte i PowerShell v6 och senare.<variable-namespace>
– En modifierare som skapats av en PowerShell PSDrive-provider . Till exempel:Namnområde beskrivning Alias:
Alias som definierats i det aktuella omfånget Env:
Miljövariabler som definierats i det aktuella omfånget Function:
Funktioner som definierats i det aktuella omfånget Variable:
Variabler som definierats i det aktuella omfånget
Standardomfånget för skript är skriptomfånget. Standardomfånget för funktioner och alias är det lokala omfånget, även om de definieras i ett skript.
Använda omfångsmodifierare
Om du vill ange omfånget för en ny variabel, ett alias eller en funktion använder du en omfångsmodifierare.
Syntaxen för en omfångsmodifierare i en variabel är:
$[<scope-modifier>:]<name> = <value>
Syntaxen för en omfångsmodifierare i en funktion är:
function [<scope-modifier>:]<name> {<function-body>}
Följande kommando, som inte använder en omfångsmodifierare, skapar en variabel i det aktuella eller lokala omfånget:
$a = "one"
Om du vill skapa samma variabel i det globala omfånget använder du omfångsmodifieraren global:
:
$global:a = "one"
Get-Variable a | Format-List *
Observera egenskapsvärdena Synlighet och Alternativ .
Name : a
Description :
Value : one
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
Jämför det med en privat variabel:
$private:pVar = 'Private variable'
Get-Variable pVar | Format-List *
Om du använder omfångsmodifieraren private
anges egenskapen Alternativ till Private
.
Name : pVar
Description :
Value : Private variable
Visibility : Public
Module :
ModuleName :
Options : Private
Attributes : {}
Om du vill skapa samma variabel i skriptomfånget använder du omfångsmodifierarenscript:
:
$script:a = "one"
Du kan också använda en omfångsmodifierare med funktioner. Följande funktionsdefinition skapar en funktion i det globala omfånget:
function global:Hello {
Write-Host "Hello, World"
}
Du kan också använda omfångsmodifierare för att referera till en variabel i ett annat omfång.
Följande kommando refererar till variabeln $test
, först i det lokala omfånget och sedan i det globala omfånget:
$test
$global:test
Omfångsmodifieraren using:
Att använda är en särskild omfångsmodifierare som identifierar en lokal variabel i ett fjärrkommando. Utan en modifierare förväntar sig PowerShell att variabler i fjärrkommandon ska definieras i fjärrsessionen.
Omfångsmodifieraren using
introduceras i PowerShell 3.0.
För alla skript eller kommandon som körs utanför sessionen behöver du omfångsmodifieraren using
för att bädda in variabelvärden från det anropande sessionsomfånget, så att kod utanför sessionen kan komma åt dem. Omfångsmodifieraren using
stöds i följande kontexter:
- Fjärrstyrda kommandon, som började med
Invoke-Command
parametrarna ComputerName, HostName, SSHConnection eller Session (fjärrsession) - Bakgrundsjobb som startats med
Start-Job
(out-of-process session) - Trådjobb, startade via
Start-ThreadJob
ellerForEach-Object -Parallel
(separat trådsession)
Beroende på kontexten är inbäddade variabelvärden antingen oberoende kopior av data i anroparens omfång eller referenser till dem. I fjärrsessioner och sessioner som inte är processer är de alltid oberoende kopior.
Mer information finns i about_Remote_Variables.
En $using:
referens expanderar bara till en variabels värde. Om du vill ändra värdet för en variabel i anroparens omfång måste du ha en referens till själva variabeln. Du kan skapa en referens till en variabel genom att hämta PSVariable-instansen av variabeln. I följande exempel visas hur du skapar en referens och gör ändringar i ett trådjobb.
$Count = 1
$refOfCount = Get-Variable Count
Start-ThreadJob {
($using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob
$Count
2
Kommentar
Detta är inte en trådsäker åtgärd. Du kan orsaka skadade data om du försöker ändra värdet från flera trådar samtidigt. Du bör använda trådsäkra datatyper eller synkroniseringspri primitiver för att skydda delade data. Mer information finns i Trådsäkra samlingar.
Serialisering av variabelvärden
Fjärrkörda kommandon och bakgrundsjobb tar slut. Out-of-process-sessioner använder XML-baserad serialisering och deserialisering för att göra värdena för variabler tillgängliga över processgränserna. Serialiseringsprocessen konverterar objekt till en PSObject som innehåller de ursprungliga objektegenskaperna men inte dess metoder.
För en begränsad uppsättning typer extraherar deserialisering objekten tillbaka till den ursprungliga typen. Det rehydrerade objektet är en kopia av den ursprungliga objektinstansen. Den har typegenskaper och metoder. För enkla typer, till exempel System.Version, är kopian exakt. För komplexa typer är kopian ofullständig. Till exempel innehåller inte de uttorkade certifikatobjekten den privata nyckeln.
Instanser av alla andra typer är PSObject-instanser . Egenskapen PSTypeNames innehåller det ursprungliga typnamnet prefixet med Deserialized, till exempel Deserialized.System.Data.DataTable
Alternativet AllScope
Variabler och alias har en alternativegenskap som kan ha värdet AllScope. Objekt som har egenskapen AllScope blir en del av alla underordnade omfång som du skapar, även om de inte ärvs retroaktivt av överordnade omfång.
Ett objekt som har egenskapen AllScope visas i det underordnade omfånget, och det är en del av det omfånget. Ändringar av objektet i ett omfång påverkar alla omfång där variabeln definieras.
Hantera omfång
Flera cmdletar har en omfångsparameter som gör att du kan hämta eller ange (skapa och ändra) objekt i ett visst omfång. Använd följande kommando för att hitta alla cmdletar i sessionen som har en omfångsparameter :
Get-Help * -Parameter scope
Om du vill hitta variablerna som visas i ett visst omfång använder du parametern Scope
Get-Variable
. De synliga variablerna omfattar globala variabler, variabler i det överordnade omfånget och variabler i det aktuella omfånget.
Följande kommando hämtar till exempel variablerna som visas i det lokala omfånget:
Get-Variable -Scope local
Om du vill skapa en variabel i ett visst omfång använder du en omfångsmodifierare eller parametern Set-Variable
Omfång för . Följande kommando skapar en variabel i det globala omfånget:
New-Variable -Scope global -Name a -Value "One"
Du kan också använda parametern Omfång för New-Alias
cmdletarna , Set-Alias
eller för Get-Alias
att ange omfånget. Följande kommando skapar ett alias i det globala omfånget:
New-Alias -Scope global -Name np -Value Notepad.exe
Om du vill hämta funktionerna i ett visst omfång använder du cmdleten Get-Item
när du är i omfånget. Cmdleten Get-Item
har ingen omfångsparameter .
Kommentar
För de cmdletar som använder parametern Omfång kan du även referera till omfång efter nummer. Talet beskriver den relativa positionen för ett omfång till ett annat. Omfång 0 representerar det aktuella eller lokala omfånget. Omfång 1 anger det omedelbara överordnade omfånget. Omfång 2 anger överordnat för det överordnade omfånget och så vidare. Numrerade omfång är användbara om du har skapat många rekursiva omfång.
Använda dot-source-notation med omfång
Skript och funktioner följer omfångsreglerna. Du skapar dem i ett visst omfång och de påverkar bara det omfånget om du inte använder en cmdlet-parameter eller en omfångsmodifierare för att ändra omfånget.
Men du kan lägga till innehållet i ett skript eller en funktion i det aktuella omfånget med dot-source-notation. När du kör ett skript eller en funktion med dot-source-notation körs det i det aktuella omfånget. Alla funktioner, alias och variabler i skriptet eller funktionen läggs till i det aktuella omfånget.
Om du till exempel vill köra skriptet Sample.ps1
C:\Scripts
från katalogen i skriptomfånget (standard för skript) anger du bara den fullständiga sökvägen till skriptfilen på kommandoraden.
c:\scripts\sample.ps1
En skriptfil måste ha ett .ps1
filnamnstillägg som kan köras. Filer som har blanksteg i sökvägen måste omges av citattecken. Om du försöker köra den citerade sökvägen visar PowerShell innehållet i den citerade strängen i stället för att köra skriptet. Med anropsoperatorn (&
) kan du köra innehållet i strängen som innehåller filnamnet.
Om du använder anropsoperatorn för att köra en funktion eller ett skript körs den i skriptomfånget. Att använda anropsoperatorn skiljer sig inte från att köra skriptet efter namn.
& c:\scripts\sample.ps1
Du kan läsa mer om samtalsoperatorn i about_Operators.
Om du vill köra skriptet Sample.ps1
i det lokala omfånget skriver du en punkt och ett blanksteg (.
) före sökvägen till skriptet:
. c:\scripts\sample.ps1
Nu läggs alla funktioner, alias eller variabler som definierats i skriptet till i det aktuella omfånget.
Begränsa utan omfång
PowerShell har vissa alternativ och funktioner som liknar omfång och kan interagera med omfång. Den här funktionen kan förväxlas med omfång eller omfångets beteende.
Sessioner, moduler och kapslade uppmaningar är fristående miljöer, inte underordnade omfång för det globala omfånget i sessionen.
Sessioner
En session är en miljö där PowerShell körs. När du skapar en session på en fjärrdator upprättar PowerShell en beständig anslutning till fjärrdatorn. Med den beständiga anslutningen kan du använda sessionen för flera relaterade kommandon.
Eftersom en session är en innesluten miljö har den ett eget omfång, men en session är inte ett underordnat omfång för sessionen där den skapades. Sessionen börjar med ett eget globalt omfång. Det här omfånget är oberoende av sessionens globala omfång. Du kan skapa underordnade omfång i sessionen. Du kan till exempel köra ett skript för att skapa ett underordnat omfång i en session.
Moduler
Du kan använda en PowerShell-modul för att dela och leverera PowerShell-verktyg. En modul är en enhet som kan innehålla cmdletar, skript, funktioner, variabler, alias och andra användbara objekt. Om de inte uttryckligen exporteras (med hjälp av Export-ModuleMember
eller modulmanifestet) är objekten i en modul inte tillgängliga utanför modulen. Därför kan du lägga till modulen i sessionen och använda offentliga objekt utan att oroa dig för att de andra objekten kan åsidosätta cmdletar, skript, funktioner och andra objekt i sessionen.
Som standard läses moduler in i runspace-omfånget på rotnivå (global). Om du importerar en modul ändras inte omfånget.
Modulerna har ett eget omfång i sessionen. Överväg följande modul C:\temp\mod1.psm1
:
$a = "Hello"
function foo {
"`$a = $a"
"`$global:a = $global:a"
}
Nu skapar vi en global variabel $a
, ger den ett värde och anropar funktionen foo.
$a = "Goodbye"
foo
Modulen deklarerar variabeln $a
i modulomfånget och funktionen foo matar ut värdet för variabeln i båda omfången.
$a = Hello
$global:a = Goodbye
Moduler skapar parallella omfångscontainrar som är länkade till omfånget där de importerades. Objekt som exporteras av modulen är tillgängliga från och med den omfångsnivå där de importeras. Objekt som inte exporteras från modulen är endast tillgängliga i modulens omfångscontainer. Funktioner i modulen kan komma åt objekt i omfånget där de importerades samt objekt i modulens omfångscontainer.
Om du läser in Module2 inifrån Modul1 läses Module2 in i omfångscontainern för Module1. Alla exporter från Module2 placeras i modulens aktuella omfång för Module1. Om du använder Import-Module -Scope local
placeras exporterna i det aktuella omfångsobjektet i stället för på den översta nivån. Om du är i en modul och läser in en annan modul med ( Import-Module -Scope global
eller Import-Module -Global
) läses modulen och dess exporter in i det globala omfånget i stället för modulens lokala omfång.
Funktionen WindowsCompatibility gör detta för att importera proxymoduler till det globala sessionstillståndet.
Kapslade frågor
Kapslade frågor har inte sitt eget omfång. När du anger en kapslad fråga är den kapslade prompten en delmängd av miljön. Men du ligger kvar inom det lokala omfånget.
Skript har ett eget omfång. Om du felsöker ett skript och når en brytpunkt i skriptet anger du skriptomfånget.
Privat alternativ
Alias och variabler har en alternativegenskap som kan ta värdet Private
. Objekt som har Private
alternativet kan visas och ändras i omfånget där de skapas, men de kan inte visas eller ändras utanför det omfånget.
Om du till exempel skapar en variabel som har ett privat alternativ i det globala omfånget och sedan kör ett skript, Get-Variable
visar kommandon i skriptet inte den privata variabeln. Om du använder den globala omfångsmodifieraren i den här instansen visas inte den privata variabeln.
Du kan använda parametern Alternativ för New-Variable
cmdletarna , Set-Variable
, New-Alias
och för Set-Alias
att ange värdet för egenskapen Option till Privat.
Synlighet
Egenskapen Synlighet för en variabel eller ett alias avgör om du kan se objektet utanför containern, där det skapades. En container kan vara en modul, ett skript eller en snapin-modul. Synligheten är utformad för containrar på samma sätt som Private
värdet för egenskapen Option är utformat för omfång.
Egenskapen Synlighet tar Public
värdena och Private
. Objekt som har privat synlighet kan endast visas och ändras i containern där de skapades. Om containern läggs till eller importeras kan objekt som har privat synlighet inte visas eller ändras.
Eftersom synligheten är utformad för containrar fungerar den annorlunda i ett omfång.
- Om du skapar ett objekt som har privat synlighet i det globala omfånget kan du inte visa eller ändra objektet i något omfång.
- Om du försöker visa eller ändra värdet för en variabel som har privat synlighet returnerar PowerShell ett felmeddelande.
Du kan använda New-Variable
cmdletarna och Set-Variable
för att skapa en variabel som har privat synlighet.
Exempel
Exempel 1: Ändra endast ett variabelvärde i ett skript
Följande kommando ändrar värdet för variabeln $ConfirmPreference
i ett skript. Ändringen påverkar inte det globala omfånget.
Använd först följande kommando för att visa värdet för variabeln $ConfirmPreference
i det lokala omfånget:
PS> $ConfirmPreference
High
Skapa ett Scope.ps1-skript som innehåller följande kommandon:
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
Kör skriptet. Skriptet ändrar värdet för variabeln $ConfirmPreference
och rapporterar sedan dess värde i skriptomfånget. Utdata bör likna följande utdata:
The value of $ConfirmPreference is Low.
Testa sedan variabelns $ConfirmPreference
aktuella värde i det aktuella omfånget.
PS> $ConfirmPreference
High
Det här exemplet visar att ändringar i värdet för en variabel i skriptomfånget inte påverkar variabelns värde i det överordnade omfånget.
Exempel 2: Visa ett variabelvärde i olika omfång
Du kan använda omfångsmodifierare för att visa värdet för en variabel i det lokala omfånget och i ett överordnat omfång.
Definiera först en $test
variabel i det globala omfånget.
$test = "Global"
Skapa sedan ett Sample.ps1
skript som definierar variabeln $test
. I skriptet använder du en omfångsmodifierare för att referera till antingen de globala eller lokala versionerna av variabeln $test
.
I Sample.ps1
:
$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."
När du kör Sample.ps1
bör utdata likna följande utdata:
The local value of $test is Local.
The global value of $test is Global.
När skriptet är klart definieras endast det globala värdet $test
för i sessionen.
PS> $test
Global
Exempel 3: Ändra värdet för en variabel i ett överordnat omfång
Om du inte skyddar ett objekt med alternativet Privat eller en annan metod kan du visa och ändra värdet för en variabel i ett överordnat omfång.
Definiera först en $test
variabel i det globala omfånget.
$test = "Global"
Skapa sedan ett Sample.ps1-skript som definierar variabeln $test
. I skriptet använder du en omfångsmodifierare för att referera till antingen de globala eller lokala versionerna av variabeln $test
.
I Sample.ps1:
$global:test = "Local"
"The global value of `$test is $global:test."
När skriptet är klart ändras det globala värdet $test
för.
PS> $test
Local
Exempel 4: Skapa en privat variabel
En variabel kan göras privat med hjälp private:
av omfångsmodifieraren eller genom att skapa variabeln med egenskapen Alternativ inställd på Private
. Privata variabler kan bara visas eller ändras i omfånget där de skapades.
I det här exemplet skapar skriptet ScopeExample.ps1
fem funktioner. Den första funktionen anropar nästa funktion, som skapar ett underordnat omfång. En av funktionerna har en privat variabel som bara kan visas i omfånget där den skapades.
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
Utdata visar värdet för variabeln i varje omfång. Du kan se att den privata variabeln endast visas i funcB
, omfånget där den skapades.
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'
Som du ser i utdata från ShowScopes
kan du komma åt variabler från andra omfång med hjälp av Get-Variable
och ange ett omfångsnummer.
Exempel 5: Använda en lokal variabel i ett fjärrkommando
Använd omfångsmodifieraren för variabler i ett fjärrkommando som skapades i den lokala sessionen using
. PowerShell förutsätter att variablerna i fjärrkommandon skapades i fjärrsessionen.
Syntax:
$using:<VariableName>
Följande kommandon skapar till exempel en $Cred
variabel i den lokala sessionen och använder sedan variabeln $Cred
i ett fjärrkommando:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $using:Cred}
Omfångsmodifieraren using
introducerades i PowerShell 3.0.