В партидните скриптове промените на променливите на средата имат общо въздействие върху текущата сесия по подразбиране. За PowerShell точната противоположност е вярна, защото сферите се използват за изолиране на модификациите на скрипта. Тук ще проучим как сферите засягат PowerShell скриптове и как да работят във и около тях.
В "PowerShell" "обхват" се отнася до текущата среда, в която работи скрипт или команда. Scopes се използват за защита на определени обекти в околната среда от непреднамерено модифициране от скриптове или функции. Особено следните неща са защитени от модификация от команди, изпълнявани от друг обхват, освен ако не е посочено друго от параметрите в тези команди:
Новите сфери се създават винаги, когато изпълнявате скрипт или функция, или когато създавате нова сесия или потребителско копие на PowerShell. Сферите, създадени чрез стартиране на скриптове и функции, имат връзка "родител / дете" с обхвата, от който са създадени. Има няколко области, които имат особено специално значение и могат да бъдат достъпни по име:
Scopes може също да се посочи по брой в някои команди, където текущият обхват е означен като нула и неговите предци са посочени от нарастващи числа. Например, в рамките на скрипт, изпълняван от глобалния обхват, обхватът на скрипта ще бъде 0 и глобалният обхват ще бъде 1. Обхват, който е допълнително вложен в обхвата на сценария, като функция, би означавал глобалния обхват като 2 Отрицателните числа обаче няма да работят, за да отбележат обхвата на детето - причината за това ще бъде очевидна скоро.
Както споменахме по-рано, командите, изпълнени в рамките на един обхват, няма да засегнат нещата в друг обхват, освен ако не е казано специално за това. Например, ако $ MyVar съществува в глобалния обхват и скриптът изпълнява команда за задаване на $ MyVar на различна стойност, глобалната версия на $ MyVar ще остане непроменена, докато копие от $ MyVar е поставено в обхвата на Скрипта с новата стойност. Ако $ MyVar не съществува, скриптът ще го създаде по подразбиране в обхвата на скрипта, а не в глобалния обхват. Това е важно да се помни, когато научите за действителната връзка родител / дете между сферите.
Връзката родител / дете на обхвата в PowerShell е еднопосочна. Командите могат да виждат и по избор да променят текущия обхват, своя родител и всички сфери над него. Въпреки това, те не могат да виждат или променят нещата при деца от настоящия обхват. Това е предимно защото, след като сте се преместили в родителски обхват, обхватът на детето вече е бил унищожен, защото е изпълнил своята цел. Например, защо трябва да видите или промените променлива в обхвата на Скрипта от глобалния обхват, след като скриптът е прекратен? Има много случаи, при които е необходимо промените в скрипта или функцията да продължат да съществуват след завършването й, но не толкова, когато е необходимо да направите промени в обектите в обхвата на скрипта или функцията преди или след нейното изпълнение. (Обикновено такива неща ще се обработват като част от самия скрипт или функция така или иначе.)
Разбира се, какви са правилата без изключения? Едно изключение от горното са Частни обхвати. Обектите в Частните сфери са достъпни само за команди, изпълнявани в обхвата, от който са създадени. Друго важно изключение са елементите, които притежават свойството AllScope. Това са специални променливи и псевдоними, за които промяна във всеки обхват ще засегне всички сфери. Следните команди ще ви покажат кои променливи и псевдоними имат свойството AllScope:
Получаване на променлива | Къде-обект $ _ Опции -замерете "AllScope" Get-Alias | Къде-обект $ _ Опции -Мач "AllScope")
За първия си поглед върху обхватите в действие ще започнем в сесия PowerShell, където променливата $ MyVar е зададена на низ от командния ред - "Аз съм глобална променлива!". След това следващият скрипт ще бъде стартиран от файл, наречен Scope-Demo.ps1:
Функция FunctionScope 'Промяна на $ MyVar с функция.' $ MyVar = "Зададох функция!" "MyVar казва $ MyVar" "Проверка на текущата стойност на $ MyVar". "MyVar казва $ MyVar" "Смяна на $ MyVar по скрипт." $ MyVar = 'Сложих си скрипт!' "MyVar казва $ MyVar" "FunctionScope" Проверка на крайната стойност на MyVar преди излизане от скрипта. " "MyVar казва $ MyVar" "
Ако скриптовете на PowerShell са работили същите като партидни скриптове, бихме могли да очакваме валяка от $ MyVar (или% MyVar% в партиден синтаксис) да се промени от "Аз съм глобална променлива!", На "Настроих се от скрипт!" , и най-сетне, че "имам определена функция!" където ще остане, докато не бъде променена изрично или сесията не приключи.Обаче, вижте какво всъщност се случва тук, когато преминем през всеки от обхвата - особено след като функцията FunctionScope завърши работата си и отново проверим променливата от скрипта, а по-късно от глобалния обхват.
Както можете да видите, промяната изглежда се променя, когато се движихме в скрипта, защото до приключването на функцията FunctionScope проверявахме променливата от същия обхват, който последно е променен. След като функцията FunctionScope приключи, се върнахме в обсега на сценария, където $ MyVar остана недокоснат от функцията. След това, когато сценарият приключи, се върнахме в глобалния обхват, където въобще не беше променена.
Така че, всичко това е добре и добре да ви помогнем да предотвратите случайно прилагането на промени в околната среда извън скриптовете и функциите си, но какво, ако действително искате да направите такива промени? Има специален и доста прост, синтаксис за създаване и модифициране на обекти извън обхвата на локалната мрежа. Току-що поставете името на полето в началото на името на променливата и поставете двоеточие между имената на обхвата и променливите. Като този:
$ глобален: MyVar $ script: MyVar $ local: MyVar
Можете да използвате тези модификатори както при преглеждането, така и при задаването на променливи. Да видим какво се случва с този демонстрационен скрипт:
Функция FunctionScope "Промяна на $ MyVar в локалния обхват на функциите ..." $ local: MyVar = "Това е MyVar в местния обхват на функцията." Промяна на $ MyVar в обхвата на скрипта ... $ script: MyVar = "Промяна на $ MyVar в глобалния обхват ..." $ global: MyVar = 'MyVar е зададен в глобалния обхват. Сега е зададена от функция "Проверка на $ MyVar във всеки обхват ..." "Локална: $ локална: MyVar" "Сценарий: $ script: MyVar" "Глобален: $ global: MyVar" "" Получаване на текущата стойност на $ MyVar ". "MyVar казва $ MyVar" "Смяна на $ MyVar по скрипт." $ MyVar = 'Сложих си скрипт!' "MyVar казва, че $ MyVar" FunctionScope "Проверява $ MyVar от обхвата на скрипта преди излизане. "MyVar казва $ MyVar" "
Както и преди, ще започнем с настройването на променливата в глобалния обхват и ще приключим с проверката на крайния резултат от глобалния обхват.
Тук можете да видите, че FunctionScope е в състояние да променят променливата в обхвата на Скрипта и промените да продължат да съществуват след завършването й. Също така промяната в променливата в глобалния обхват се запази и след излизането на сценария. Това може да бъде особено полезно, ако трябва многократно да променяте променливи в сценария или в глобалния обхват, като използвате същия код - просто определяте функция или скрипт, който е написан, за да променя променливата къде и как се нуждаете от нея, и обадете се, когато са необходими тези промени.
Както бе споменато по-рано, в някои команди могат да се използват номера на обхвата, за да се променят променливите на различни нива във връзка с локалния обхват. Ето и същия скрипт, използван във втория пример по-горе, но с функцията, модифицирана да използва команди за получаване на променлива и задаване на променливи с номера на обхвата, вместо директно да препраща към променливата с назовани сфери:
Функция FunctionScope "Промяна на $ MyVar в обхват 0, спрямо FunctionScope ..." Set-Variable MyVar "Това е MyVar в обхвата на функцията 0." -Scope 0 "Промяна на $ MyVar в обхват 1, спрямо FunctionScope ..." Set-Variable MyVar "MyVar беше променен в обхват 1, от функция." -Scope 1 'Промяна на $ MyVar в обхват 2, в сравнение с Functionscope ... "Set-Variable MyVar" MyVar е променен в обхват 2, от функция. - Скорост 2: "Проверка на $ MyVar във всеки обхват ..." Обхват 0: "GetVariable MyVar -Scope 0 -ValueOnly" Обхват 1: "GetVariable MyVar -Scope 1 -ValueOnly" Обхват 2: "GetVariable MyVar -Scope 2 -ValueOnly "" Получаване на текущата стойност на $ MyVar. " "MyVar казва $ MyVar" "Смяна на $ MyVar по скрипт." $ MyVar = 'Сложих си скрипт!' "MyVar казва, че $ MyVar" FunctionScope "Проверява $ MyVar от обхвата на скрипта преди излизане. "MyVar казва $ MyVar" "
Подобно на преди, можем да видим как командите в един обхват могат да променят обекти в основния си обхват.
Има още много неща, които могат да се правят с полета, отколкото могат да се поберат в тази статия. Scopes засягат повече от променливи и все още има още какво да се научим за частните сфери и променливите AllScope. За по-полезна информация можете да изпълните следната команда от PowerShell:
Get-Help about_scopes
Същият помощен файл е налице и в TechNet.
Обхват на кредитната картина: spadassin на openclipart