about_Scopes

Kort beskrivning

Beskriver begreppet omfång i PowerShell och visar hur du ställer in 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 omfånget där det skapades och i 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 har skapat 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 vara dolt 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 rotens överordnade omfång 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: Omfånget 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.

Överordnade och underordnade 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 objekten privata är objekten i det överordnade omfånget tillgängliga för det underordnade omfånget. 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.

Anteckning

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 det globala omfånget. All modulkod körs i en modulspecifik hierarki med 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 det 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 vissa automatiska variabler.

Om du vill hitta objekten i ett visst omfång använder du parametern Scope 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

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.

    Anteckning

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

  • 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 skript körs via cmdletar som Start-Job och Invoke-Command.

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

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

    Namnområde Description
    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ångsmodifieraren script: :

$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 Using du omfångsmodifieraren för att bädda in variabelvärden från det anropande sessionsomfånget, så att utanför sessionskoden 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 (session utan process)
  • Trådjobb, startade 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 out-of-process-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 omfångsvariabler för anrop i en annan tråd. Om du vill ä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 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 ett PSObject som innehåller de ursprungliga objektegenskaperna, men inte dess metoder.

För en begränsad uppsättning typer extraherar deserialiseringen objekt tillbaka till den ursprungliga typen. Det extraherade 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 ofullkomlig. Extraherade certifikatobjekt innehåller till exempel inte 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 en Option-egenskap 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 som variabeln definieras i.

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 ScopeGet-Variableför . 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 de variabler 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 New-AliasScope för cmdletarna , 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 .

Anteckning

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 punktkällans notation med omfång

Skript och funktioner följer alla omfångsregler. 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 Sample.ps1 skriptet 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 skriptet Sample.ps1 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 skapas av Sample.ps1 skriptet är inte tillgängliga i det aktuella omfånget.

Begränsa utan omfång

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

Sessioner, moduler och kapslade frågor är självständiga miljöer, men de är 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 sitt eget omfång, men en session är inte ett underordnat omfång för 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 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 det inte uttryckligen definieras ä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 de offentliga objekten utan att oroa dig för att de andra objekten ska å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 det aktuella omfånget. Det aktuella sessionstillståndet kan vara ett modulsessionstillstånd eller det globala sessionstillståndet. Om du lägger till en modul i en session ändras inte omfånget. Om du befinner dig i det globala omfånget läses modulerna in i det globala sessionstillståndet. Exporter placeras i de globala tabellerna. Om du läser in modul2 inifrån modul1 läses module2 in i sessionstillståndet för modul1, inte det globala sessionstillståndet. Alla exporter från modul2 placeras överst i sessionstillstå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 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. Modulen WindowsCompatibility gör detta för att importera proxymoduler till det globala sessionstillståndet.

I sessionstillståndet har moduler sitt eget omfång. Tänk på 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 frågor

Kapslade frågor har inte ett 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 i det lokala omfånget.

Skript har ett eget omfång. Om du felsöker ett skript och du når en brytpunkt i skriptet anger du skriptomfånget.

Privat alternativ

Alias och variabler har en Option-egenskap 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 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 alternativparametern New-Variableför cmdletarna , Set-Variable, New-Aliasoch Set-Alias för 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 Visibility 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 de 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 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.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 privat variabel är en variabel som har en alternativegenskap som har värdet Private. Private variabler ärvs av det underordnade omfånget, men de kan bara visas eller ändras i omfånget där de skapades.

Följande kommando skapar en privat variabel med namnet $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

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}

Användningsomfånget introducerades i PowerShell 3.0. Använd följande kommandoformat för att ange att en variabel skapades i den lokala sessionen i PowerShell 2.0.

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

Se även