Hvordan Scopes påvirker PowerShell Scripts
I batchskripter har ændringer til miljøvariabler som standard en global indvirkning på den aktuelle session. For PowerShell er det nøjagtige modsatte sandt, fordi scopes bruges til at isolere et scripts modifikationer. Her undersøger vi hvordan scopes påvirker PowerShell-scripts og hvordan man arbejder i og omkring dem.
Hvad er et anvendelsesområde?
I PowerShell refererer et "omfang" til det nuværende miljø, hvor et script eller kommandoskal opererer. Scopes bruges til at beskytte visse genstande i miljøet fra at blive utilsigtet ændret af skrifter eller funktioner. Navnlig er følgende ting beskyttet mod modifikation af kommandoer, der løber fra et andet omfang, medmindre andet er angivet af parametre i disse kommandoer:
- Variable
- aliasser
- Funktioner
- PowerShell-drev (PSDrives)
Nye scopes oprettes, når du kører et script eller en funktion, eller når du opretter en ny session eller en forekomst af PowerShell. Områder oprettet ved at køre scripts og funktioner har et "forældre / barn" forhold med det omfang, hvorfra de blev oprettet. Der er et par scopes, der har særlig specielle betydninger, og kan fås ved navn:
- Det Global omfang er det omfang, der oprettes, når PowerShell starter. Den omfatter variabler, aliaser, funktioner og PSDrives, der er indbygget i PowerShell, samt alle, der er lavet af din PowerShell-profil.
- Det Lokal anvendelsesområde refererer til, hvad det nuværende omfang er. Når du starter PowerShell, refererer det til det globale omfang, inden for et script bliver Script-omfanget mv.
- Det Manuskript Omfanget oprettes, når et script køres. De eneste kommandoer, der opererer inden for dette omfang, er dem, der er i scriptet.
- Privat scopes kan defineres inden for det nuværende omfang for at forhindre kommandoer i andre områder at kunne læse eller ændre elementer, som de ellers ville have adgang til.
Scopes kan også henvises til nummer i bestemte kommandoer, hvor det nuværende anvendelsesområde henvises til som nul, og dets forfædre refereres ved at øge heltal. For eksempel inden for et script, der løber fra det globale anvendelsesområde, vil Script-omfanget være 0, og det globale omfang ville være 1. Et omfang, der blev yderligere indlejret i Script-anvendelsesområdet, som en funktion, ville henvise til det globale omfang som 2 . Negative tal vil dog ikke fungere for at henvise til børnemetoder - årsagen til dette vil ses tydeligt.
Hvordan Scopes påvirker kommandoer
Som tidligere nævnt vil kommandoer, der udføres inden for et anvendelsesområde, ikke påvirke tingene i et andet omfang, medmindre det udtrykkeligt er angivet at gøre det. Hvis f.eks. $ MyVar eksisterer i det globale omfang, og et script kører en kommando for at indstille $ MyVar til en anden værdi, forbliver den globale version af $ MyVar uændret, mens en kopi af $ MyVar er placeret i Script-omfanget med den nye værdi. Hvis en $ MyVar ikke eksisterer, vil et script skabe det inden for Script-anvendelsesområdet som standard - ikke i det globale omfang. Dette er vigtigt at huske, da du lærer om det aktuelle forældre / barn forhold mellem scopes.
Forældrenes / børns forholdet mellem scopes i PowerShell er envejs. Kommandoer kan se ind i og eventuelt ændre det nuværende omfang, dets forælder og enhver rækkevidde ovenfor. Men de kan ikke se eller ændre tingene i nogen børn i det nuværende omfang. Dette skyldes først og fremmest, at når du har flyttet ind i et overordnet omfang, er barnets omfang allerede ødelagt, fordi det har opfyldt dets formål. Hvorfor skal du for eksempel se eller ændre en variabel i Script-omfanget, fra det globale omfang, efter at scriptet er afsluttet? Der er masser af tilfælde, hvor du har brug for et scripts eller funktionens ændringer for at fortsætte ud over dets gennemførelse, men ikke så mange, hvor du skal foretage ændringer i objekter inden for scriptets eller funktionens omfang før eller efter det køres. (Normalt vil sådanne ting blive håndteret som en del af scriptet eller funktionen alligevel.)
Selvfølgelig, hvad er regler uden undtagelser? En undtagelse til ovenstående er private scopes. Objekter i de private scopes er kun tilgængelige for kommandoer, der kører i det område, hvorfra de blev oprettet. En anden vigtig undtagelse er varer, der har AllScope-ejendommen. Disse er specielle variabler og aliaser, for hvilke en ændring i ethvert anvendelsesområde vil påvirke alle anvendelsesområder. Følgende kommandoer viser dig hvilke variabler og aliaser, der har AllScope-egenskaben:
Get-Variable | Hvor-objekt $ _. Indstillinger -match 'AllScope' Get-Alias | Hvor-objekt $ _. Indstillinger -match 'AllScope')
Omfang i aktion
For vores første kig på scopes in action, vil vi starte i en PowerShell-session, hvor variablen $ MyVar er blevet sat til en streng, 'Jeg er en global variabel!', Fra kommandolinjen. Derefter køres følgende script fra en fil kaldet Scope-Demo.ps1:
Funktion FunctionScope 'Ændring $ MyVar med en funktion.' $ MyVar = 'Jeg blev sat af en funktion!' "MyVar siger $ MyVar" "Kontrollerer nuværende værdi af $ MyVar." "MyVar siger $ MyVar" "Ændring af $ MyVar efter script." $ MyVar = 'Jeg blev indstillet af et script!' "MyVar siger $ MyVar" "FunctionScope" Kontrollerer slutværdien af MyVar før script exit. " "MyVar siger $ MyVar" "
Hvis PowerShell-scripts fungerede det samme som batch scripts, forventer vi, at $ MyVar (eller% MyVar% i batchsyntax) vælger at ændre sig fra 'Jeg er en global variabel!' Til 'Jeg blev sat af et script!' , og endelig til 'Jeg blev sat af en funktion!' hvor det vil forblive, indtil det eksplicit ændres igen eller sessionen opsiges. Se dog, hvad der faktisk sker her, når vi bevæger os gennem hver af de forskellige områder - især efter at FunctionScope-funktionen har gennemført sit arbejde, og vi kontrollerer variablen igen fra Script og senere Global scope.
Som du kan se, var variablen tilsyneladende ændret, da vi flyttede gennem scriptet, fordi vi indtil funktionen FunctionScope blev gennemført, kontrollerede vi variablen inden for samme omfang, som sidst blev ændret. Efter at FunctionScope blev gjort, flyttede vi tilbage til Script-anvendelsesområdet, hvor $ MyVar blev uberørt af funktionen. Så, da scriptet sluttede, kom vi tilbage til det globale omfang, hvor det ikke var blevet ændret overhovedet.
Reach uden for det lokale område
Så det er alt sammen godt og godt at hjælpe dig med at holde fra et uheld at anvende ændringer i miljøet ud over dine scripts og funktioner, men hvad hvis du rent faktisk ønsker at foretage sådanne ændringer? Der er en speciel og ret simpel syntakse til at oprette og ændre objekter ud over lokalområdet. Du sætter bare rækkeviddenavnet i starten af variablenavnet og sætter et kolon mellem rækkevidde og variabelnavne. Sådan her:
$ global: MyVar $ script: MyVar $ local: MyVar
Du kan bruge disse modifikatorer både når du ser og indstiller variabler. Lad os se hvad der sker med dette demonstrationsskript:
Funktion FunktionScope "Ændring af $ MyVar i det lokale funktionsområde ..." $ local: MyVar = "Dette er MyVar i funktionens lokale anvendelsesområde." 'Ændring af $ MyVar i scriptets omfang ...' $ script: MyVar = 'MyVar plejede at være sæt af et script. Nu indstillet af en funktion. "Ændring af $ MyVar i det globale omfang ... '$ global: MyVar =' MyVar blev sat i det globale omfang. Nu indstillet af en funktion. "Kontrol af $ MyVar i hvert omfang ..." "Lokal: $ local: MyVar" "Script: $ script: MyVar" "Global: $ global: MyVar" "" Få nuværende værdi af $ MyVar. " "MyVar siger $ MyVar" "Ændring af $ MyVar efter script." $ MyVar = 'Jeg blev indstillet af et script!' "MyVar siger $ MyVar" FunctionScope "Kontrollerer $ MyVar fra scriptomfanget før afslutningen. ' "MyVar siger $ MyVar" "
Som før begynder vi ved at indstille variablen i det globale omfang og slutte med at kontrollere det endelige globale omfangsresultat.
Her kan du se, at FunctionScope var i stand til at ændre variablen i Script-omfanget, og at ændringerne vedvarer, efter at den blev gennemført. Endvidere fortsatte ændringen til variablen i det globale omfang, selv efter at scriptet var ophørt. Dette kan være særligt nyttigt, hvis du gentagne gange skal ændre variabler inden for et script eller inden for det globale anvendelsesområde ved hjælp af samme kode. Du definerer bare en funktion eller et script, der er skrevet til at ændre variablen, hvor og hvordan du har brug for det, og opfordre til det, når disse ændringer er nødvendige.
Som tidligere nævnt kan anvendelsesnumre også bruges i bestemte kommandoer til at ændre variablen på forskellige niveauer i forhold til lokalområdet. Her er det samme script, der bruges i det andet eksempel ovenfor, men med funktionen ændret til at bruge kommandoerne Variabel og Set-Variabel med rækkeviddenumre i stedet for direkte at referere til variablen med navngivne scopes:
Funktion FunctionScope "Ændring af $ MyVar i rækkevidde 0, i forhold til FunctionScope ... 'Set-Variable MyVar" Dette er MyVar i funktionens omfang 0. "-Scope 0' Ændring af $ MyVar i rækkevidde 1, i forhold til FunctionScope ... 'Set-Variable MyVar 'MyVar blev ændret i rækkevidde 1, fra en funktion.' -Scope 1 'Ændring af $ MyVar i rækkevidde 2, i forhold til Functionscope ...' Set-Variable MyVar 'MyVar blev ændret i rækkevidde 2, fra en funktion.' -Scope 2 "Kontrollerer $ MyVar i hvert omfang ..." Scope 0: 'Variabel MyVar -Scope 0 -ValueOnly' Scope 1: 'Variabel MyVar -Scope 1 -ValueOnly' Scope 2: 'Variabel MyVar -Scope 2 -ValueOnly "" Få den nuværende værdi af $ MyVar. " "MyVar siger $ MyVar" "Ændring af $ MyVar efter script." $ MyVar = 'Jeg blev indstillet af et script!' "MyVar siger $ MyVar" FunctionScope "Kontrollerer $ MyVar fra scriptomfanget før afslutningen. ' "MyVar siger $ MyVar" "
På samme måde som før, kan vi se her, hvordan kommandoer i ét omfang kan ændre objekter i sit overordnede anvendelsesområde.
Yderligere Information
Der er stadig meget mere, der kan gøres med scopes end kan passe ind i denne artikel. Scopes påvirker mere end bare variabler, og der er stadig mere at lære om Private scopes og AllScope variablerne. For mere brugbar information kan du køre følgende kommando fra PowerShell:
Få hjælp om_scopes
Den samme hjælpefil er også tilgængelig på TechNet.
Omfang billed kredit: Spadassin på openclipart