I batchskript har förändringar i miljövariabler som standard en global inverkan på den aktuella sessionen. För PowerShell är det exakta motsatsen sant eftersom omfattningar används för att isolera ett skripts modifikationer. Här kommer vi att undersöka hur omfattningar påverkar PowerShell-skript och hur de fungerar i och runt dem.
I PowerShell avser en "scope" den aktuella miljön där ett skript eller kommandoskal är i drift. Områden används för att skydda vissa föremål inom miljön från oavsiktligt modifierad av skript eller funktioner. Speciellt är följande saker skyddade mot modifiering av kommandon som körs från ett annat omfång, om inte annat anges av parametrar i dessa kommandon:
Nya scopes skapas när du kör ett skript eller en funktion, eller när du skapar en ny session eller ett exempel på PowerShell. Områden som skapats av löpande skript och funktioner har ett "föräldra / barn" -förhållande med omfattningen från vilken de skapades. Det finns några områden som har särskilt speciella betydelser och kan nås med namn:
Områden kan också hänvisas till med nummer i vissa kommandon, där nuvarande räckvidd hänvisas till som noll och dess förfäder hänvisas till genom att öka heltal. Till exempel, inom ett skript som körs från det globala räckviddet, skulle Script-räckviddet vara 0 och det globala räckviddet skulle vara 1. En räckvidd som var nästare inuti Script-omfattningen, såsom en funktion, skulle referera till det globala räckviddet som 2 Negativa siffror kommer dock inte att fungera för att referera till barnomfattningar. Årsaken till detta kommer snart att uppstå.
Som tidigare nämnts kommer kommandon som exekveras inom ett räckvidd inte att påverka saker i ett annat räckvidd om inte specifikt berättas att göra så. Om till exempel $ MyVar existerar i det globala räckviddet och ett skript kör ett kommando för att ställa in $ MyVar till ett annat värde, kommer den globala versionen av $ MyVar att förbli oförändrad medan en kopia av $ MyVar placeras i Script-räckvidden med den nya värde. Om en $ MyVar inte existerar, skapar ett skript det i Script-räckvidd som standard - inte i det globala räckviddet. Det här är viktigt att komma ihåg när du lär dig om det faktiska förhållandet mellan föräldrar och barn mellan olika områden.
Förhållandet mellan föräldrar och barn i olika områden i PowerShell är envägs. Kommandon kan se in och eventuellt ändra det nuvarande omfånget, dess förälder och eventuella omfång ovanför. De kan emellertid inte se eller ändra saker i några barn av nuvarande omfattning. Det här beror främst på att, när du har flyttat till ett föräldraansvar, har barnets räckvidd redan förstörts eftersom det har uppfyllt sitt syfte. Till exempel, varför skulle du behöva se eller ändra en variabel i Script-räckvidden, från det globala räckviddet, efter att manuset avslutats? Det finns många fall där du behöver ett skript eller funktionens ändringar för att fortsätta utöver dess slutförande, men inte så många där du skulle behöva göra ändringar av objekt inom skriptets eller funktionens räckvidd före eller efter det att det körs. (Vanligtvis kommer sådana saker att hanteras som en del av själva skriptet eller funktionen.)
Vad är reglerna utan undantag? Ett undantag till ovanstående är privata omfång. Objekt i privata omfång är endast tillgängliga för kommandon som körs inom ramen för vilket de skapades. Ett annat viktigt undantag är objekt som har AllScope-egendomen. Dessa är speciella variabler och aliaser för vilka en förändring i valfri omfattning kommer att påverka alla omfång. Följande kommandon visar vilka variabler och alias som har AllScope-egenskapen:
Get-Variable | Var-Objekt {$ _. Alternativ -Match 'AllScope'} Get-Alias | Var-Objekt {$ _. Alternativ -Match 'AllScope')
För vår första titt på mål i åtgärd, kommer vi att börja i en PowerShell-session där variabeln $ MyVar har ställts in till en sträng, "Jag är en global variabel!", från kommandoraden. Sedan kommer följande skript att köras från en fil som heter Scope-Demo.ps1:
Funktion FunctionScope {'Ändrar $ MyVar med en funktion.' $ MyVar = 'Jag blev inställd av en funktion!' "MyVar säger $ MyVar"} "Kontrollera nuvärdet på $ MyVar." "MyVar säger $ MyVar" "Ändra $ MyVar med script." $ MyVar = 'Jag blev inställd av ett manus!' "MyVar säger $ MyVar" "FunctionScope" Kontrollerar slutligt värde för MyVar innan man avslutar script. " "MyVar säger $ MyVar" "
Om PowerShell-skript fungerade på samma sätt som batchskript, förväntar vi oss att $ MyVar (eller% MyVar% i batchsyntax) faller från" Jag är en global variabel! ", till "Jag blev uppsatt av ett manus!", och slutligen till "Jag blev inställd av en funktion!" där det skulle stanna tills det uttryckligen ändras igen eller sessionen avslutas. Se emellertid vad som händer faktiskt här när vi flyttar genom vart och ett av områdena - särskilt efter att FunctionScope-funktionen har slutfört sitt arbete och vi kontrollerar variabeln igen från Script , och senare Global, scope.
Som du kan se variabeln tycktes förändras när vi flyttade genom manuset eftersom, tills funktionen FunctionScope slutfördes, kontrollerade vi variabeln inom samma räckvidd som den var sist ändrats. Efter att FunctionScope gjordes skedde vi tillbaka till Script-räckvidden där $ MyVar lämnades orörd av funktionen. Sedan när manuset avslutades kom vi tillbaka till det globala räckvidd där det inte hade modifierats alls.
Så det här är allt bra och bra för att hjälpa dig att oavsiktligt genomföra förändringar i miljön utöver dina skript och funktioner, men om du faktiskt vill göra en sådan modifiering tioner? Det finns en speciell och ganska enkel syntax för att skapa och ändra objekt utanför lokalområdet. Du sätter bara namnet på omfattningen i början av variabelnamnet och sätter ett kolon mellan räckvidd och variabla namn. Gilla detta:
$ globalt: MyVar $ script: MyVar $ local: MyVar
Du kan använda dessa modifierare både när du visar och ställer in variabler. Låt oss se vad som händer med det här demonstrationsskriptet:
Funktion FunctionScope {"Ändrar $ MyVar i det lokala funktionsomfånget ..." $ local: MyVar = "Detta är MyVar i funktionens lokala räckvidd." 'Ändra $ MyVar i scriptets omfattning ... '$ script: MyVar =' MyVar användes för att ställas in av ett skript. Nu ställs in av en funktion. 'Ändra $ MyVar i det globala räckviddet ...' $ global: MyVar = 'MyVar ställdes in i det globala räckviddet. Nu ställs in av en funktion. "Kontrollera $ MyVar i varje räckvidd ..." "Lokalt: $ local: MyVar" "Skript: $ script: MyVar" "Global: $ global: MyVar" "}" Kommer nuvarande värde av $ MyVar. " "MyVar säger $ MyVar" "Ändra $ MyVar med script." $ MyVar = 'Jag blev inställd av ett manus!' "MyVar säger $ MyVar" FunctionScope "Kontrollerar $ MyVar från scriptsomfattning före avfärd." "MyVar säger $ MyVar" "
Som tidigare börjar vi genom att ställa in variabeln i det globala räckviddet och sluta med att kontrollera det slutliga globala räckviddsresultatet.
Här kan du se att FunctionScope kunde ändra variabeln i Script-räckvidden, och har förändringarna kvarstår efter det att det har slutförts. Förändringen till variabeln i det globala omfånget fortsatte även efter att skriptet hade gått ut. Detta kan vara särskilt användbart för om du upprepade gånger måste ändra variabler i ett manus , eller inom den globala räckvidden, med samma kod - definierar du bara en funktion eller ett skript som är skrivet för att ändra variabeln var och hur du behöver det, och ringa på det närhelst dessa ändringar är nödvändiga.
Som tidigare nämnts, räckviddsnummer kan också användas i vissa kommandon för att ändra variabeln på olika nivåer i förhållande till det lokala räckviddet. Det här är samma skript som används i det andra exemplet ovan, men med funktionen modifierad för att använda kommandona Get-Variable och Set-Variable med räckvidd num bers istället för att direkt hänvisa till variabeln med namnet omfång:
Funktion FunctionScope {"Ändra $ MyVar i räckvidd 0, i förhållande till FunctionScope ..." Set-Variable MyVar "Detta är MyVar i funktionens räckvidd 0." -Scope 0 'Ändrar $ MyVar i räckvidd 1, i förhållande till FunctionScope ...' Set-Variable MyVar 'MyVar ändrades i räckvidd 1, från en funktion.' -Scope 1 'Ändra $ MyVar i räckvidd 2, i förhållande till Functionscope ...' Set-Variable MyVar 'MyVar ändrades i räckvidd 2, från en funktion.' -Scope 2 "Kontrollerar $ MyVar i varje räckvidd ..." Omfattning 0: "Variabel MyVar -Scope 0 -ValueOnly" Scope 1: "Variabel MyVar -Scope 1 -ValueOnly" Scope 2: "Variabel MyVar -Scope 2 -ValueOnly "}" Få nuvärdet av $ MyVar. " "MyVar säger $ MyVar" "Ändra $ MyVar med script." $ MyVar = 'Jag blev inställd av ett manus!' "MyVar säger $ MyVar" FunctionScope "Kontrollerar $ MyVar från scriptsomfattning före avfärd." "MyVar säger $ MyVar" "
På samma sätt som tidigare kan vi se här hur kommandon i ett räckvidd kan ändra objekt i dess överordnade omfattning.
Det finns fortfarande mycket mer som kan göras med omfång än kan passa in i den här artikeln. Scopes påverkar mer än bara variabler, och det finns fortfarande mer att lära sig om privata omfång och AllScope-variablerna. För mer användbar information kan du köra följande kommando inom PowerShell:
Få hjälp om_scopes
Samma hjälpfil finns också på TechNet.
Omfattningskredit: Spadassin på openclipart
Hur man följer hyperlänkar i Word 2013 utan att hålla ner Ctrl-tangenten
Som standard öppnas direkta hyperlänkar i Word i standardbläddraren genom att trycka och hålla ner "Ctrl" -knappen och klicka på länk. Om du hellre vill bara klicka för att följa en hyperlänk, kan du enkelt inaktivera "Ctrl + Click" med en inställning. För att komma åt den här inställningen klickar du på fliken "File".
Mac ekvivalenter av Windows-program och funktioner
Om du nyligen konverterat till en Mac eller är tvungen att använda en mot din vilja, är du antagligen van vid användarvänlig miljö i Windows och vill du veta Mac-ekvivalenten till ditt favoritprogram eller -funktion i Windows, eller hur?Nåväl, de senaste Mac-datorerna som kör de senaste versionerna av OS X är inte vilda annorlunda än de nuvarande versionerna av Windows. Den störs