Dela via


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 oavsiktligt ändrar ett objekt som inte ska ändras.

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 det omfång där det skapades och i alla underordnade omfång, såvida du inte uttryckligen gör det privat.

  • Du kan deklarera variabler, alias, funktioner och PowerShell-enheter i 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.

Om du skapar ett objekt i ett omfång och objektet delar sitt namn med ett objekt i ett annat omfång kan det ursprungliga objektet döljas under det nya objektet, men det åsidosätts eller ändras inte.

PowerShell-omfång

PowerShell stöder följande omfång:

  • Global: Det omfång som gäller när PowerShell startar eller när du skapar en ny session eller ett nytt körningsutrymme. Variabler och funktioner som finns när PowerShell startar har skapats i det globala omfånget, till exempel automatiska variabler och inställningsvariabler. Variabler, alias och funktioner i dina PowerShell-profiler skapas också i det globala omfånget. Det globala omfånget är det överordnade rotomfånget i en session.

  • Lokal: Det aktuella omfånget. Det lokala omfånget kan vara det globala omfånget eller något annat omfång.

  • Skript: Det omfång som skapas när en skriptfil körs. Endast kommandona i skriptet körs i skriptomfånget. För kommandona i ett skript är skriptomfånget det lokala omfånget.

Anmärkning

Privat är inte ett omfång. Det är ett alternativ som ändrar synligheten för ett objekt utanför omfånget där objektet definieras.

Överordnat och underordnat omfång

Du kan skapa ett nytt underomfå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.

Om du inte uttryckligen gör elementen privata, är elementen i det överordnade omfånget tillgängliga för det underordnade. Objekt som du skapar och ändrar i det underordnade omfånget påverkar dock inte det överordnade omfånget, såvida du inte uttryckligen anger omfånget när du skapar objekten.

Anmärkning

Funktioner från en modul körs inte i ett underordnat omfång till det anropande omfånget. Moduler har ett eget sessionstillstånd som är länkat till det globala omfånget. All modulkod körs i en hierarki av modulspecifika omfång som har ett eget rotomfång.

Arv

Ett underordnat omfång ärver inte variabler, alias och funktioner från det överordnade omfånget. Om inte ett objekt är privat kan det underordnade omfånget visa objekten i det överordnade omfånget. Och den kan ändra objekten genom att uttryckligen ange det överordnade omfånget, men objekten ingår inte i det underordnade omfånget.

Ett underordnat omfång skapas dock med en uppsättning objekt. Vanligtvis innehåller den alla alias som har alternativet AllScope . Det här alternativet beskrivs senare i den här artikeln. Den innehåller alla variabler som har alternativet AllScope , plus några automatiska variabler.

Om du vill hitta objekten i ett visst omfång använder du parametern Omfång för Get-Variable 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

Modifierare av omfång

En variabel, ett alias eller ett funktionsnamn kan innehålla någon av följande valfria omfångsmodifierare:

  • global: – Anger att namnet finns i omfånget Global.

  • local: – Anger att namnet finns i omfånget Local. Det aktuella omfånget är alltid Lokalt.

  • private: – Anger att namnet är Privat och endast synligt för det aktuella omfånget.

  • script: – Anger att namnet finns i omfånget Script. Script scope ä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 skript körs via cmdlets som Start-Job och Invoke-Command.

  • workflow: – Anger att namnet finns i ett arbetsflöde. Arbetsflöden stöds inte i PowerShell v6 och senare.

  • <variable-namespace> - En modifierare som skapats av en PowerShell PSDrive-provider. Till exempel:

    Namespace Beskrivning
    Alias: Aliaser definierade 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 globala omfång använder du omfångsmodifieraren global:.

$global:a = "one"

Om du vill skapa samma variabel i skriptets omfång använder du script: omfångsmodifierare:

$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

Modifieraren för Using:-omfång

Using är en speciell 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.

Den Using omfångsmodifieraren introduceras i PowerShell 3.0.

För skript eller kommandon som körs utanför sessionen behöver du Using omfångsmodifierare för att bädda in variabelvärden från sessionsomfånget för samtal, så att kod utanför sessionen kan komma åt dem. Den Using omfångsmodifieraren stöds i följande kontexter:

  • Fjärrstyrda kommandon, som startades med Invoke-Command med hjälp av parametrarna ComputerName, HostName, SSHConnection eller Session (fjärrsession)
  • Bakgrundsjobb, startade med Start-Job (session utanför processen)
  • Trådjobb som startas via Start-ThreadJob eller ForEach-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ärranslutna och icke-processbundna sessioner är de alltid oberoende kopior.

Mer information finns i about_Remote_Variables.

I trådsessioner skickas de med referens. Det innebär att det är möjligt att ändra variabler för samtalsomfång i en annan tråd. För att ändra variabler på ett säkert sätt krävs trådsynkronisering.

Mer information finns i:

Serialisering av variabelvärden

Fjärrkörda kommandon och bakgrundsjobb körs utanför processen. 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 återställer 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 med prefixet Deserialized, till exempel Deserialized.System.Data.DataTable

Alternativet AllScope

Variabler och alias har egenskapen Alternativ som kan ta 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 ä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 cmdlet har en parameter för "Omfång" () som låter dig hämta eller ställa in (skapa och ändra) objekt inom ett specifikt omfång. Använd följande kommando för att hitta alla cmdletar i sessionen som har parametern Scope:

Get-Help * -Parameter scope

Om du vill hitta variablerna som visas i ett visst omfång använder du parametern Scope för 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 Scope för Set-Variable. 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 cmdletarna New-Alias, Set-Aliaseller Get-Alias för 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 .

Anmärkning

För de cmdletar som använder parametern Scope kan du även referera till omfång efter nummer. Antalet beskriver den relativa positionen för ett område i förhållande till ett annat. Omfång 0 representerar det aktuella eller lokala omfånget. Omfång 1 anger det omedelbara föräldraomfånget. Omfång 2 anger föräldern till föräldraomfå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 alla regler för omfång. 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 ett skript eller en funktion i det aktuella omfånget med hjälp av punktkällans notation. När ett skript sedan körs i det aktuella omfånget är alla funktioner, alias och variabler som skriptet skapar tillgängliga i det aktuella omfånget.

Om du vill lägga till en funktion i det aktuella omfånget skriver du en punkt (.) och ett blanksteg före sökvägen och namnet på funktionen i funktionsanropet.

Om du till exempel vill köra skriptet Sample.ps1 från katalogen C:\Scripts i skriptomfånget (standard för skript) använder du följande kommando:

c:\scripts\sample.ps1

Om du vill köra Sample.ps1 skriptet i det lokala omfånget använder du följande kommando:

. c:\scripts.sample.ps1

När du använder anropsoperatorn (&) för att köra en funktion eller ett skript läggs den inte till i det aktuella omfånget. I följande exempel används anropsoperatorn:

& c:\scripts.sample.ps1

Du kan läsa mer om samtalsoperatören i about_operators.

Alias, funktioner eller variabler som Sample.ps1 skriptet skapar är inte tillgängliga i det aktuella omfånget.

Begränsa utan omfattning

Några PowerShell-begrepp liknar omfånget eller interagerar med omfånget. Dessa begrepp kan förväxlas med omfång eller omfångets beteende.

Sessioner, moduler och kapslade prompter är fristående miljöer, men de är inte underordnade omfång till 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 sitt eget omfång, men en session är inte ett underordnat omfång till den session 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 delomfattningar i sessionen. Till exempel kan du köra ett skript för att skapa en undernivå i en session.

Modules

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 det inte uttryckligen anges ä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 på den översta nivån i det aktuella sessionstillståndet , inte i det aktuella omfånget. Det aktuella sessionstillståndet kan vara ett modulsessionstillstånd eller det globala sessionstillståndet. Att lägga till en modul i en session ändrar inte omfånget. Om du befinner dig i det globala omfånget läses modulerna in i det globala sessionstillståndet. Alla exporter placeras i de globala tabellerna. Om du läser in module2 inifrån module1 läses module2 in i sessionstillståndet för module1, inte i det globala sessionstillståndet. Alla exporter från module2 placeras överst i sessiontillståndet module1. Om du använder Import-Module -Scope localplaceras exporterna i det aktuella omfångsobjektet i stället för på den översta nivån. Om du är i en modul och använder Import-Module -Scope global (eller Import-Module -Global) för att läsa in en annan modul läses den modulen och dess exporter in i det globala sessionstillståndet i stället för modulens lokala sessionstillstånd. Den här funktionen har utformats för att skriva moduler som manipulerar moduler. WindowsCompatibility-modulen gör detta för att importera proxymoduler till det globala sessionstillståndet.

I sessionstillståndet har modulerna sitt eget omfång. Ö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

Kapslade prompter

Kapslade prompter har inget eget omfång. När du anger en kapslad prompt är den kapslade uppmaningen en delmängd av miljön. Men du stannar inom det lokala området.

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 Option egenskap som kan ha värdet Private. Objekt som har alternativet Privat kan visas och ändras i det omfång 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 visas inte den privata variabeln för kommandon i skriptet. Om du använder den globala omfångsmodifieraren i det här fallet visas inte den privata variabeln.

Du kan använda parametern Alternativ för cmdletarna New-Variable, Set-Variable, New-Aliasoch Set-Alias för att ange värdet för egenskapen Alternativ 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. Synlighet är utformat för containrar på samma sätt som värdet Privat för egenskapen Alternativ är utformat för omfång.

Egenskapen Visibility tar värdena Public och Private . Objekt som har privat synlighet kan endast visas och ändras i containern där de skapades. Om behållaren läggs till eller importeras går det inte att visa eller ändra de objekt som har privat synlighet.

Eftersom synligheten är utformad för containrar, fungerar den annorlunda inom en omfattning.

  • 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 cmdletarna New-Variable 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 det aktuella värdet för variabeln $ConfirmPreference i det aktuella omfånget.

PS>  $ConfirmPreference
High

Det här exemplet visar att ändringar av 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.ps1bö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 för $test 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 hjälp av alternativet Privat eller någon 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 för $test.

PS>  $test
Local

Exempel 4: Skapa en privat variabel

En privat variabel är en variabel som har en Option-egenskap som har värdet Private. Privata variabler ärvs av det underordnade omfånget, men de kan bara visas eller ändras i det omfång där de skapades.

Följande kommando skapar en privat variabel som anropas $ptest i det lokala omfånget.

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

Du kan visa och ändra värdet $ptest för i det lokala omfånget.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

Skapa sedan ett Sample.ps1 skript som innehåller följande kommandon. Kommandot försöker visa och ändra värdet $ptestför .

I Sample.ps1:

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

Variabeln $ptest visas inte i skriptomfånget, utdata är tomma.

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

Exempel 5: Använda en lokal variabel i ett fjärrkommando

För variabler i ett fjärrkommando som skapades i den lokala sessionen använder du Using omfångsmodifierare. PowerShell förutsätter att variablerna i fjärrkommandon skapades i fjärrsessionen.

Syntaxen är:

$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ånget Using introducerades i PowerShell 3.0. I PowerShell 2.0 använder du följande kommandoformat för att ange att en variabel har skapats i den lokala sessionen.

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

Se även