Om omfång
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 placera variabler, alias, funktioner eller PowerShell-enheter i ett eller flera omfång.
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. 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.
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.
Anteckning
Privat är inte ett omfång. Det är ett alternativ som ändrar synligheten för ett objekt utanför det omfång där objektet har definierats.
Överordnade och underordnade omfång
Du kan skapa ett nytt omfång genom att köra ett skript eller en funktion, genom att skapa en session eller genom att starta en ny instans av PowerShell. När du skapar ett nytt omfång är resultatet ett överordnat omfång (det ursprungliga omfånget) och ett underordnat omfång (det omfång som du skapade).
I PowerShell är alla omfång underordnade omfång i det globala omfånget, men du kan skapa många omfång och många rekursiva omfång.
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.
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.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 somStart-Job
ochInvoke-Command
.workflow:
– Anger att namnet finns i ett arbetsflöde. Obs! Arbetsflöden stöds inte i PowerShell Core.<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"
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.
Modifieraren Using scope (Använda omfång) introduceras i PowerShell 3.0.
Mer information finns i about_Remote_Variables.
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 har definierats 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 Scope
Get-Variable
fö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-Alias
Scope för cmdletarna , Set-Alias
eller 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 Sample.ps1 skript skapar ä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.
Sekretessen för en modul fungerar som ett omfång, men om du lägger till en modul i en session ändras inte omfånget. Och modulen har inte ett eget omfång, även om skripten i modulen, precis som alla PowerShell-skript, har sitt eget omfång.
Som standard läses moduler in på den översta nivån i det aktuella sessionstillståndet , inte det aktuella omfånget. Detta kan vara ett modulsessionstillstånd eller det globala sessionstillståndet. 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 modul1-sessionstillståndet, inte det globala sessionstillståndet. Alla exporter från modul2 placeras överst i modul1-sessionstillståndet. 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 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 omfånget.
Kapslade frågor
På samma sätt har kapslade prompter 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 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 Alternativ-egenskap som kan ta värdet Privat. Objekt som har alternativet Privat 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-Variable
för cmdletarna , Set-Variable
, New-Alias
och 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 det privata värdet för egenskapen Option är utformat för omfång.
Egenskapen Synlighet tar värdena offentlig och privat . 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 på olika sätt 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 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.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 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 $test
för .
PS> $test
Local
Exempel 4: Skapa en privat variabel
En privat variabel är en variabel som har en Option-egenskap som har värdet Privat. Privata 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 $ptest
fö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