I batchskript har endringer i miljøvariabler som standard en global innvirkning på gjeldende sesjon. For PowerShell er det nøyaktige motsatt sant fordi rekkevidde brukes til å isolere et skripts modifikasjoner. Her skal vi undersøke hvordan omfangene påvirker PowerShell-skript og hvordan de skal fungere i og rundt dem.
I PowerShell refererer et "omfang" til det nåværende miljøet der et skript eller kommando skal er i drift. Scopes brukes til å beskytte enkelte gjenstander i miljøet fra å bli utilsiktet modifisert av skript eller funksjoner. Spesielt er følgende ting beskyttet mot modifisering av kommandoer som kjører fra et annet omfang, med mindre annet er angitt ved parametere i disse kommandoene:
Nye rekkevidder opprettes når du kjører et skript eller en funksjon, eller når du oppretter en ny økt eller en forekomst av PowerShell. Scopes opprettet ved å kjøre skript og funksjoner har et "foreldre / barn" forhold med omfanget de ble laget av. Det er noen rekkevidder som har spesielt spesielle betydninger, og kan nås med navn:
Omfang kan også henvises til i tall i bestemte kommandoer, der nåværende omfang refereres til som null, og dets forfedre refereres ved å øke heltall. For eksempel, i et skript som kjører fra det globale omfanget, vil Script-omfanget være 0 og det globale omfanget ville være 1. Et omfang som ble ytterligere nestet i Script-omfanget, for eksempel en funksjon, ville referere til det globale omfanget som 2 . Negative tall vil imidlertid ikke fungere for å referere til barnestørrelser. Årsaken til dette kommer snart til syne.
Som nevnt tidligere vil kommandoer som utføres i ett omfang ikke påvirke ting i et annet omfang, med mindre det er spesifikt fortalt å gjøre slik. Hvis for eksempel $ MyVar eksisterer i det globale omfanget og et skript kjører en kommando for å sette $ MyVar til en annen verdi, forblir den globale versjonen av $ MyVar uendret mens en kopi av $ MyVar plasseres i Script-omfanget med den nye verdi. Hvis en $ MyVar ikke eksisterer, vil et skript opprette det innenfor Script-omfanget som standard - ikke i det globale omfanget. Dette er viktig å huske når du lærer om det faktiske foreldre / barnforholdet mellom rekkevidde.
Forholdet mellom foreldre og barn i rekkevidde i PowerShell er enveis. Kommandoer kan se på og eventuelt modifisere det nåværende omfanget, dets overordnede og eventuelle omfang over det. Men de kan ikke se eller endre ting i noen barn i det nåværende omfanget. Dette er først og fremst fordi når du har flyttet inn i foreldreomfanget, har barnets omfang allerede blitt ødelagt fordi det har oppfylt sin hensikt. For eksempel, hvorfor må du se eller endre en variabel i Script-omfanget, fra det globale omfanget, etter at manuset har avsluttet? Det er mange tilfeller der du trenger et skript eller funksjonens endringer for å vedvare utover fullførelsen, men ikke så mange hvor du vil måtte gjøre endringer i objekter innenfor skriptets eller funksjonens omfang før eller etter det kjøres. (Vanligvis vil slike ting bli håndtert som en del av skriptet eller funksjonen uansett.)
Hva er selvsagt regler uten unntak? Ett unntak til det ovenfor er private scopes. Objekter i de private omfangene er bare tilgjengelige for kommandoer som kjører i omfanget de ble opprettet fra. Et annet viktig unntak er elementer som har AllScope-eiendommen. Dette er spesielle variabler og aliaser der en endring i noe omfang vil påvirke alle omfang. Følgende kommandoer vil vise deg hvilke variabler og aliaser som har AllScope-egenskapen:
Get-Variable | Hvor-objekt {$ _. Alternativer -match 'AllScope'} Hent-alias | Hvor-objekt {$ _. Alternativer -match 'AllScope')
For vår første titt på målene i aksjon, skal vi starte i en PowerShell-økt der variabelen $ MyVar er satt til en streng, 'Jeg er en global variabel!', fra kommandolinjen. Deretter kjøres følgende skript fra en fil som heter Scope-Demo.ps1:
Funksjon FunctionScope {'Endre $ MyVar med en funksjon.' $ MyVar = 'Jeg ble satt av en funksjon!' "MyVar sier $ MyVar"} "Kontrollerer nåverdien av $ MyVar." "MyVar sier $ MyVar" "Endre $ MyVar etter script." $ MyVar = 'Jeg ble satt av et skript!' "MyVar sier $ MyVar" "FunctionScope" Kontrollerer endelig verdi av MyVar før man avslutter script. " "MyVar sier $ MyVar" "
Hvis PowerShell-skript fungerte som batchskript, ville vi forvente at valget på $ MyVar (eller% MyVar% i batchsyntaxen) endres fra 'Jeg er en global variabel!', til 'Jeg ble satt av et skript!', og til slutt til 'Jeg ble satt av en funksjon!' hvor det vil forbli til det eksplisitt endres igjen eller økten avsluttes. Se imidlertid hva som faktisk skjer her når vi beveger oss gjennom hver av målene - spesielt etter at FunctionScope-funksjonen har fullført sitt arbeid og vi sjekker variabelen igjen fra Script , og senere det globale omfanget.
Som du kan se variabelen syntes å endres etter hvert som vi flyttet gjennom skriptet fordi, til funksjonen FunctionScope ble fullført, sjekket vi på variabelen fra samme omfang som sist endret. Etter at FunctionScope ble gjort skjønt, flyttet vi tilbake til Script-omfanget hvor $ MyVar ble uberørt av funksjonen. Da da skriptet ble avsluttet, kom vi tilbake til det globale omfanget der det ikke var blitt endret i det hele tatt.
Så dette er alt bra og bra for å hjelpe deg med å forhindre at du ved et uhell bruker miljøendringer utover dine skript og funksjoner, men hva om du egentlig vil gjøre slike modifikasjoner asjon? Det er en spesiell og ganske enkel syntaks for å skape og endre objekter utenfor lokalområdet. Du plasserer bare omfangsnavnet ved starten av variabelnavnet, og legger et kolon mellom omfanget og variabelnavnet. Som dette:
$ global: MyVar $ script: MyVar $ local: MyVar
Du kan bruke disse modifiseringene både når du ser og definerer variabler. La oss se hva som skjer med dette demonstrasjonsskriptet:
Funksjon FunksjonScope {"Endre $ MyVar i det lokale funksjonsområdet ..." $ local: MyVar = "Dette er MyVar i funksjonens lokale omfang." 'Endre $ MyVar i scriptets omfang ... '$ script: MyVar =' MyVar ble satt av et skript. Nå satt av en funksjon. 'Endre $ MyVar i det globale omfanget ...' $ global: MyVar = 'MyVar ble satt i det globale omfanget. Nå sett av en funksjon. "Kontrollerer $ MyVar i hvert omfang ..." "Lokalt: $ local: MyVar" "Skript: $ script: MyVar" "Global: $ global: MyVar" "}" Få nåverdien av $ MyVar. " "MyVar sier $ MyVar" "Endre $ MyVar etter script." $ MyVar = 'Jeg ble satt av et skript!' "MyVar sier $ MyVar" FunctionScope "Kontrollerer $ MyVar fra skriptomfanget før utgang. ' "MyVar sier $ MyVar" "
Som før starter vi ved å sette variabelen i det globale omfanget og avslutte med å sjekke det endelige globale omfanget resultatet.
Her kan du se at FunctionScope var i stand til å endre variabelen i Script-omfanget, og har endringene vedvarende etter at det ble fullført. Også endringen i variabelen i det globale omfanget fortsatte selv etter at skriptet hadde gått ut. Dette kan være spesielt nyttig for hvis du må endre gjentatte ganger variabler i et skript , eller innenfor det globale omfanget, bruker du samme kode - du definerer bare en funksjon eller et skript som er skrevet for å endre variabelen hvor og hvordan du trenger det, og ringe på det når disse endringene er nødvendige.
Som nevnt tidligere, omfangsnumre kan også brukes i enkelte kommandoer for å endre variabelen på forskjellige nivåer i forhold til det lokale omfanget. Dette er det samme skriptet som brukes i det andre eksempelet ovenfor, men med funksjonen endret for å bruke kommandoene Variable og Set-Variable med omfang num bers i stedet for direkte å referere til variabelen med navngitte omfang:
Funksjon FunctionScope {"Endrer $ MyVar i omfang 0, i forhold til FunctionScope ..." Set-Variable MyVar "Dette er MyVar i funksjonens omfang 0." -Scope 0 'Endrer $ MyVar i omfang 1, i forhold til FunctionScope ...' Set-Variable MyVar 'MyVar ble endret i omfang 1, fra en funksjon.' -Scope 1 'Endre $ MyVar i omfang 2, i forhold til Functionscope ...' Set-Variable MyVar 'MyVar ble endret i omfang 2, fra en funksjon.' -Scope 2 "Kontrollerer $ MyVar i hvert omfang ..." Omfang 0: 'Variabel MyVar -Scope 0 -ValueOnly' Scope 1: 'Variabel MyVar -Scope 1 -ValueOnly' Scope 2: 'Variabel MyVar -Scope 2 -ValueOnly "}" Få nåverdien av $ MyVar. " "MyVar sier $ MyVar" "Endre $ MyVar etter script." $ MyVar = 'Jeg ble satt av et skript!' "MyVar sier $ MyVar" FunctionScope "Kontrollerer $ MyVar fra skriptomfanget før utgang. ' "MyVar sier $ MyVar" "
Ligner på før, kan vi se her hvordan kommandoer i ett område kan endre objekter i sitt overordnede omfang.
Det er fortsatt mye mer som kan gjøres med omfang enn Scopes påvirker mer enn bare variabler, og det er fortsatt mer å lære om Private scopes og AllScope-variablene. For mer nyttig informasjon kan du kjøre følgende kommando fra PowerShell:
Få hjelp om_scopes
Den samme hjelpefilen er også tilgjengelig på TechNet.
Scope-bilde kreditt: Spadassin på openclipart
Slik legger du til nettstedslinker til Windows 10 Start-menyen
Windows 10-startmenyen er veldig tilpassbar. Legg til nettsnarveier til Start-menyen, og du kan raskt få tilgang til favorittnettstedene dine ved å klikke på en flis. Dette virker med Microsoft Edge, Google Chrome eller en annen nettleser. Instruksjonene er litt forskjellige for hver nettleser, men vi vil gå gjennom dem en etter en.
Når trenger du å oppdatere drivere?
Snakk med noen teknisk person, les et hvilket som helst forum, og på et tidspunkt er du sikker på å bli fortalt å oppdatere driverne ... men hva gjør det betyr egentlig? Og er det nødvendig å kompulsivt oppdatere driverne? Her er vår ta. Drivere? Hva er drivere? I svært enkle termer er drivere dataprogrammer som lar Windows og de andre programmene samhandle med en maskinvareenhet.