no.phhsnews.com


no.phhsnews.com / Hvordan Scopes påvirker PowerShell Scripts

Hvordan Scopes påvirker PowerShell Scripts


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.

Hva er et område?

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:

  • Variabler
  • Aliaser
  • Funksjoner
  • PowerShell-stasjoner (PSDrives)

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:

  • The Global omfanget er det omfanget som opprettes når PowerShell starter. Den inneholder variablene, aliasene, funksjonene og PSDrivene som er innebygd i PowerShell, samt alle som er laget av PowerShell-profilen din.
  • Området Lokalt refererer til hva det nåværende omfanget er. Når du starter PowerShell, vil det referere til det globale omfanget, innenfor et skript vil det være Script-omfanget etc.
  • Området Script opprettes når et skript kjøres. De eneste kommandoene som opererer innenfor dette omfanget er de som er i skriptet.
  • Private kan omfang defineres innenfor det nåværende omfanget, for å hindre kommandoer i andre områder å kunne lese eller endre elementer de ellers ville ha Tilgang til.

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.

Hvordan omfang påvirker kommandoer

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')

Omfang i aksjon

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.

Nå utenfor det lokale omfanget

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.

Tilleggsinformasjon

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 får du gruppemeddelelser som individuelle meldinger på Android

Slik får du gruppemeddelelser som individuelle meldinger på Android

Noen ganger er gruppemeldinger bare mer fornuftige enn å sende individuelle meldinger. Når du prøver å få en gruppe mennesker helt, og en samtale må skje, er å legge alle i samme melding veien til å gå. Andre ganger, det er ikke tilfelle. Måten gruppemeldingene fungerer mest på, er ganske grei: SMS-meldingen blir konvertert til MMS, sendt til alle på distribusjonslisten.

(how-to)

Slik ser du hvilke programmer som tømmer Mac-batteriet ditt

Slik ser du hvilke programmer som tømmer Mac-batteriet ditt

Macen din sporer "energibesparelsen" for hvert kjørende program på noen få steder. Som på en iPhone eller iPad, kan du se nøyaktig hvilke apper som bruker mest strøm, og juster bruken din slik at du ikke går tom for juice. Programmer er ikke det eneste som tømmer batteristrøm selvfølgelig . Maskinvarekomponenter som skjermen, Wi-Fi og Bluetooth bruker batteristrøm så lenge de er på, så denne listen over programmer er bare en del av bildet, men det er en stor, og en du har en god del av kontroll over.

(how-to)