Как сферите засягат PowerShell скриптовете

Съдържание:

Как сферите засягат PowerShell скриптовете
Как сферите засягат PowerShell скриптовете

Видео: Как сферите засягат PowerShell скриптовете

Видео: Как сферите засягат PowerShell скриптовете
Видео: ZEITGEIST: MOVING FORWARD | OFFICIAL RELEASE | 2011 - YouTube 2024, Април
Anonim
В партидните скриптове промените на променливите на средата имат общо влияние върху текущата сесия по подразбиране. За PowerShell точната противоположност е вярна, защото сферите се използват за изолиране на модификациите на скрипта. Тук ще проучим как сферите засягат PowerShell скриптове и как да работят във и около тях.
В партидните скриптове промените на променливите на средата имат общо влияние върху текущата сесия по подразбиране. За PowerShell точната противоположност е вярна, защото сферите се използват за изолиране на модификациите на скрипта. Тук ще проучим как сферите засягат PowerShell скриптове и как да работят във и около тях.

Какво е Обхват?

В "PowerShell" "обхват" се отнася до текущата среда, в която работи скрипт или команда. Scopes се използват за защита на определени обекти в околната среда от непреднамерено модифициране от скриптове или функции. Особено следните неща са защитени от модификация от команди, изпълнявани от друг обхват, освен ако не е посочено друго от параметрите в тези команди:

  • Променливи
  • Псевдоними
  • Функции
  • PowerShell устройства (PSDrives)

Новите сфери се създават винаги, когато изпълнявате скрипт или функция, или когато създавате нова сесия или потребителско копие на PowerShell. Сферите, създадени чрез стартиране на скриптове и функции, имат връзка "родител / дете" с обхвата, от който са създадени. Има няколко области, които имат особено специално значение и могат да бъдат достъпни по име:

  • Най- в световен мащаб обхватът е обхватът, който се създава, когато PowerShell стартира. Тя включва променливите, псевдонимите, функциите и PSDrives, които са вградени в PowerShell, както и всички, които се правят от Вашия PowerShell профил.
  • Най- местен обхват се отнася до каквато и да е текущата област. Когато стартирате PowerShell, той ще се отнася до глобалния обхват, в рамките на скрипта ще бъде обхват на сценария и т.н.
  • Най- писменост Обхватът се създава, когато се изпълнява скрипт. Единствените команди, които работят в този обхват, са тези, които са в скрипта.
  • частен обхватът може да бъде дефиниран в рамките на настоящия обхват, за да се предотврати възможността командите в други сфери да бъдат в състояние да четат или променят елементи, които биха могли да имат достъп до тях.

Scopes може също да се посочи по брой в някои команди, където текущият обхват е означен като нула и неговите предци са посочени от нарастващи числа. Например, в рамките на скрипт, изпълняван от глобалния обхват, обхватът на скрипта ще бъде 0 и глобалният обхват ще бъде 1. Обхват, който е допълнително вложен в обхвата на сценария, като функция, би означавал глобалния обхват като 2 Отрицателните числа обаче няма да работят, за да отбележат обхвата на детето - причината за това ще бъде очевидна скоро.

Как сферите засягат командите

Както споменахме по-рано, командите, изпълнени в рамките на един обхват, няма да засегнат нещата в друг обхват, освен ако не е казано специално за това. Например, ако $ MyVar съществува в глобалния обхват и скриптът изпълнява команда за задаване на $ MyVar на различна стойност, глобалната версия на $ MyVar ще остане непроменена, докато копие от $ MyVar е поставено в обхвата на Скрипта с новата стойност. Ако $ MyVar не съществува, скриптът ще го създаде по подразбиране в обхвата на скрипта, а не в глобалния обхват. Това е важно да се помни, когато научите за действителната връзка родител / дете между сферите.

Връзката родител / дете на обхвата в PowerShell е еднопосочна. Командите могат да виждат и по избор да променят текущия обхват, своя родител и всички сфери над него. Въпреки това, те не могат да виждат или променят нещата при деца от настоящия обхват. Това е предимно защото, след като сте се преместили в родителски обхват, обхватът на детето вече е бил унищожен, защото е изпълнил своята цел. Например, защо трябва да видите или промените променлива в обхвата на Скрипта от глобалния обхват, след като скриптът е прекратен? Има много случаи, при които е необходимо промените в скрипта или функцията да продължат да съществуват след завършването й, но не толкова, когато е необходимо да направите промени в обектите в обхвата на скрипта или функцията преди или след нейното изпълнение. (Обикновено такива неща ще се обработват като част от самия скрипт или функция така или иначе.)

Разбира се, какви са правилата без изключения? Едно изключение от горното са Частни обхвати. Обектите в Частните сфери са достъпни само за команди, изпълнявани в обхвата, от който са създадени. Друго важно изключение са елементите, които притежават свойството AllScope. Това са специални променливи и псевдоними, за които промяна във всеки обхват ще засегне всички сфери. Следните команди ще ви покажат кои променливи и псевдоними имат свойството AllScope:

Get-Variable | Where-Object {$_.Options -match 'AllScope'} Get-Alias | Where-Object {$_.Options -match 'AllScope')

Сцени в действие

За първия си поглед върху обхватите в действие ще започнем в сесия PowerShell, където променливата $ MyVar е зададена на низ от командния ред - "Аз съм глобална променлива!". След това следващият скрипт ще бъде стартиран от файл, наречен Scope-Demo.ps1:

Function FunctionScope { 'Changing $MyVar with a function.' $MyVar = 'I got set by a function!' 'MyVar says $MyVar' } '' 'Checking current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' '' FunctionScope '' 'Checking final value of MyVar before script exit.' 'MyVar says $MyVar' ''

Ако скриптовете на PowerShell са работили същите като партидни скриптове, бихме могли да очакваме валяка от $ MyVar (или% MyVar% в партиден синтаксис) да се промени от "Аз съм глобална променлива!", На "Настроих се от скрипт!", и най-накрая "Настроих се чрез функция!", където ще остане, докато не бъде изрично променена отново или сесията не приключи. Обаче, вижте какво всъщност се случва тук, когато преминем през всеки от обхвата - особено след като функцията FunctionScope завърши работата си и отново проверим променливата от скрипта, а по-късно от глобалния обхват.

Както можете да видите, промяната изглежда се променя, когато се движихме в скрипта, защото до приключването на функцията FunctionScope проверявахме променливата от същия обхват, който последно е променен. След като функцията FunctionScope приключи, се върнахме в обсега на сценария, където $ MyVar остана недокоснат от функцията. След това, когато сценарият приключи, се върнахме в глобалния обхват, където изобщо не беше променено.
Както можете да видите, промяната изглежда се променя, когато се движихме в скрипта, защото до приключването на функцията FunctionScope проверявахме променливата от същия обхват, който последно е променен. След като функцията FunctionScope приключи, се върнахме в обсега на сценария, където $ MyVar остана недокоснат от функцията. След това, когато сценарият приключи, се върнахме в глобалния обхват, където изобщо не беше променено.

Достигане извън местния обхват

Така че, всичко това е добре и добре да ви помогнем да предотвратите случайно прилагането на промени в околната среда извън скриптовете и функциите си, но какво, ако действително искате да направите такива промени? Има специален и сравнително прост, синтаксис за създаване и модифициране на обекти извън местен обхват. Току-що поставете името на полето в началото на името на променливата и поставете двоеточие между имената на обхвата и променливите. Като този:

$global:MyVar $script:MyVar $local:MyVar

Можете да използвате тези модификатори както при преглеждането, така и при задаването на променливи. Нека видим какво се случва с този демонстрационен скрипт:

Function FunctionScope { '' 'Changing $MyVar in the local function scope…' $local:MyVar = 'This is MyVar in the function's local scope.' 'Changing $MyVar in the script scope…' $script:MyVar = 'MyVar used to be set by a script. Now set by a function.' 'Changing $MyVar in the global scope…' $global:MyVar = 'MyVar was set in the global scope. Now set by a function.' '' 'Checking $MyVar in each scope…' 'Local: $local:MyVar' 'Script: $script:MyVar' 'Global: $global:MyVar' '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Както и преди, ние ще започнем с настройването на променливата в глобалния обхват и ще приключим с проверката на крайния резултат от глобалния обхват.

Тук можете да видите, че FunctionScope е в състояние да променят променливата в обхвата на Скрипта и промените да продължат да съществуват след завършването й. Също така промяната в променливата в глобалния обхват се запази и след излизането на сценария. Това може да бъде особено полезно, ако трябва многократно да променяте променливи в скрипт или в глобалния обхват, като използвате един и същ код - просто определяте функция или скрипт, който е написан, за да променя променливата къде и как се нуждаете от нея направете го и го потърсете, когато са необходими тези промени.
Тук можете да видите, че FunctionScope е в състояние да променят променливата в обхвата на Скрипта и промените да продължат да съществуват след завършването й. Също така промяната в променливата в глобалния обхват се запази и след излизането на сценария. Това може да бъде особено полезно, ако трябва многократно да променяте променливи в скрипт или в глобалния обхват, като използвате един и същ код - просто определяте функция или скрипт, който е написан, за да променя променливата къде и как се нуждаете от нея направете го и го потърсете, когато са необходими тези промени.

Както бе споменато по-рано, в някои команди могат да се използват номера на обхвата, за да се променят променливите на различни нива във връзка с локалния обхват. Тук е същият скрипт, използван във втория пример по-горе, но с функцията, модифицирана да използва команди "Получете променлива" и "Задайте променлива" с номера на обхвата, вместо пряко да посочвате променливата с назовани сфери:

Function FunctionScope { '' 'Changing $MyVar in scope 0, relative to FunctionScope…' Set-Variable MyVar 'This is MyVar in the function's scope 0.' –Scope 0 'Changing $MyVar in scope 1, relative to FunctionScope…' Set-Variable MyVar 'MyVar was changed in scope 1, from a function.' –Scope 1 'Changing $MyVar in scope 2, relative to Functionscope…' Set-Variable MyVar 'MyVar was changed in scope 2, from a function.' –Scope 2 '' 'Checking $MyVar in each scope…' ‘Scope 0:’ Get-Variable MyVar –Scope 0 –ValueOnly ‘Scope 1:’ Get-Variable MyVar –Scope 1 –ValueOnly ‘Scope 2:’ Get-Variable MyVar –Scope 2 –ValueOnly '' } '' 'Getting current value of $MyVar.' 'MyVar says $MyVar' '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' 'MyVar says $MyVar' FunctionScope 'Checking $MyVar from script scope before exit.' 'MyVar says $MyVar' ''

Image
Image

Подобно на преди, можем да видим как командите в един обхват могат да променят обекти в основния си обхват.

Допълнителна информация

Все още има много повече неща, които могат да бъдат направени с полета, отколкото може да се побере в тази статия. Сферите обхващат не само променливи, а има още какво да се научим за частните сфери и променливите на AllScope. За по-полезна информация можете да изпълните следната команда от PowerShell:

Get-Help about_scopes

Същият помощен файл е налице и в TechNet.

Обхват на кредитната картина: spadassin на openclipart

Препоръчано: