Како Сцопес утичу на ПоверСхелл скрипте
У батцх скриптама, промене променљивих окружења имају глобални утицај на тренутну сесију. За ПоверСхелл, тачно супротно је тачно зато што се опсези користе за изоловање модификација скрипте. Овде ћемо истражити како опсези утичу на ПоверСхелл скрипте и како да раде у њима и око њих.
Шта је опсег?
У програму ПоверСхелл, "сцопе" се односи на тренутну околину у којој скрипта или командна љуска раде. Опсези се користе за заштиту одређених објеката у окружењу од ненамерног модификовања скриптама или функцијама. Нарочито, следеће ствари су заштићене од модификације командама које се покрећу из другог опсега, осим ако параметрима у тим командама није другачије назначено:
- Променљиве
- Алиасес
- Функције
- ПоверСхелл дискови (ПСДривес)
Нови опсези се креирају сваки пут када покренете скрипту или функцију, или када креирате нову сесију или инстанцу ПоверСхелл-а. Подручја креирана покретањем скрипти и функција имају однос "родитељ / дијете" са опсегом из којег су креирана. Постоји неколико области које имају посебно специјална значења и којима се може приступити именом:
- Тхе Глобално опсег је опсег који се креира када се покрене ПоверСхелл. Укључује варијабле, псеудониме, функције и ПСДриве који су уграђени у ПоверСхелл, као и све које је направио ваш ПоверСхелл профил.
- Тхе Лоцал се односи на било који тренутни опсег. Када покренете ПоверСхелл то ће се односити на глобални опсег, унутар скрипте то ће бити Сцрипт опсег, итд.
- Тхе Скрипта опсег се креира када се покрене скрипт. Једине команде које раде унутар овог опсега су оне које су у скрипти.
- Приватни опсези могу бити дефинисани у оквиру тренутног опсега, да би се спречило да наредбе у другим областима буду у стању да читају или мењају ставке које би иначе имале приступ.
Опсези се такође могу позивати на број у одређеним командама, где се тренутни опсег назива нула, а његови преци се наводе повећањем целих бројева. На пример, унутар скрипте која се покреће из глобалног опсега, опсег Скрипта би био 0, а Глобални опсег би био 1. Опсег који је даље уграђен у опсег скрипте, као што је функција, односи се на глобални опсег као 2 Негативни бројеви неће радити на референтним пољима за децу - разлог за то ће ускоро бити очигледан.
Како Сцопес утиче на команде
Као што је раније поменуто, команде извршене унутар једног опсега неће утицати на ствари у другом опсегу, осим ако је изричито речено да то учине. На пример, ако $ МиВар постоји у глобалном опсегу, а скрипта покреће наредбу да постави $ МиВар на другу вриједност, глобална верзија $ МиВар ће остати непромијењена док ће копија $ МиВар бити стављена у опсег скрипте са новим вредност. Ако $ МиВар не постоји, скрипта ће га креирати унутар опсега скрипте по дефаулту - не у глобалном опсегу. Ово је важно запамтити док учите о стварном односу родитеља и дјетета између опсега.
Однос родитељ / дијете опсега у ПоверСхелл-у је у једном смјеру. Наредбе могу да виде, и опционо модификују, тренутни опсег, његов родитељ и све области изнад тога. Међутим, они не могу да виде или модификују ствари у било којој деци тренутног опсега. Ово је првенствено зато што, када се преселите у родитељски опсег, опсег детета је већ уништен јер је испунио своју сврху. На пример, зашто бисте морали да гледате или мењате променљиву у опсегу скрипте, из глобалног опсега, након што се скрипта заврши? Постоји много случајева где вам је потребна промена у скрипти или функцији да бисте наставили да трају дуже од њеног завршетка, али не толико тамо где би требало да направите промене у објектима унутар опсега скрипте или функције пре или после покретања. (Обично ће се такве ствари третирати као дио скрипте или ће и сама функционирати.)
Наравно, која су правила без изузетака? Један изузетак од горе наведеног су Приватни опсези. Објекти у приватним областима су доступни само командама које се покрећу у опсегу из кога су креиране. Други важан изузетак су ставке које имају АллСцопе својство. Ово су специјалне варијабле и псеудониме за које ће промена у било ком опсегу утицати на све области. Следеће команде ће вам показати које променљиве и алиасе имају АллСцопе својство:
Гет-Вариабле | Где-Објецт $ _. Оптионс -матцх 'АллСцопе' Гет-Алиас | Вхере-Објецт $ _. Опције -матцх 'АллСцопе')
Опсези у акцији
За наш први поглед на области у акцији, почињемо у ПоверСхелл сесији где је променљива $ МиВар постављена на стринг, 'ја сам глобална променљива!', Из командне линије. Затим ће се следећа скрипта покренути из датотеке која се зове Сцопе-Демо.пс1:
Функција ФунцтионСцопе 'Промена $ МиВар са функцијом.' $ МиВар = 'Поставио сам функцију!' "МиВар каже $ МиВар" "Проверава тренутну вредност $ МиВар." "МиВар каже $ МиВар" "Промена $ МиВар по скрипти." $ МиВар = 'Поставио сам га скриптом!' "МиВар каже $ МиВар" "ФунцтионСцопе" Провјера коначне вриједности МиВар прије изласка из скрипте. ' "МиВар каже $ МиВар" "
Ако су ПоверСхелл скрипте радиле исто као и батцх скрипте, очекивали бисмо да се долина $ МиВар (или% МиВар% у синтакси у серији) промени из 'Ја сам глобална променљива!', У 'Имам сет по скрипти!' , и коначно до "Имам одређену функцију!" где ће остати док се не промени изричито или се сесија прекине. Међутим, погледајте шта се заправо дешава овде док се крећемо кроз сваки од опсега - нарочито, након што функција ФунцтионСцопе заврши свој рад и поново проверимо променљиву из скрипте, а касније и из Глобалног, опсега.
Као што видите, варијабла се променила док смо се кретали кроз скрипту, јер, све док функција ФунцтионСцопе није завршена, проверавали смо променљиву из истог опсега који је последњи пут промењен. Након што је ФунцтионСцопе извршен, вратили смо се у Сцрипт опсег где је $ МиВар остао нетакнут функцијом. Онда, када је скрипт завршен, вратили смо се у глобални опсег где уопште није био модификован.
Достизање изван локалног опсега
Дакле, све је то добро и добро да би вам помогло да не приметите случајно промене у окружењу изван ваших скрипти и функција, али шта ако заиста желите да направите такве измене? Постоји специјална и прилично једноставна синтакса за креирање и модификовање објеката изван локалног опсега. Само ставите име опсега на почетак имена променљиве и ставите колону између назива опсега и променљивих. Овако:
$ глобал: МиВар $ сцрипт: МиВар $ лоцал: МиВар
Ове модификаторе можете користити и када гледате и постављате варијабле. Да видимо шта се дешава са овом демонстрацијском скриптом:
Функција ФунцтионСцопе "Промена $ МиВар у опсегу локалне функције ... '$ лоцал: МиВар =" Ово је МиВар у локалном опсегу функције. "' Промена $ МиВар у опсегу скрипте ... '$ сцрипт: МиВар =' МиВар је некада био Поставите је помоћу скрипте. Сада поставите функцију. "Промена $ МиВар у глобалном опсегу ..." $ глобал: МиВар = 'МиВар је постављен у глобалном опсегу. Сада поставите функцију. "Провера $ МиВар у сваком опсегу ..." "Локално: $ лоцал: МиВар" "Скрипт: $ сцрипт: МиВар" "Глобал: $ глобал: МиВар" "" Добијање тренутне вредности $ МиВар. " "МиВар каже $ МиВар" "Промена $ МиВар по скрипти." $ МиВар = 'Поставио сам га скриптом!' "МиВар каже $ МиВар" ФунцтионСцопе 'Провера $ МиВар из опсега скрипте пре излаза.' "МиВар каже $ МиВар" "
Као и раније, ми ћемо почети са постављањем варијабле у Глобалном опсегу и завршити са провјером коначног резултата Глобалног опсега.
Овде можете видети да је ФунцтионСцопе успио да промени варијаблу у опсегу скрипте, и да се промене наставе након што је завршена. Такође, промена променљиве у опсегу Глобал је постојала чак и након што је скрипта изашла. Ово може бити посебно корисно ако морате опетовано мењати варијабле унутар скрипте, или унутар глобалног опсега, користећи исти код - само дефинишете функцију или скрипту која је написана да би променила променљиву где и како је потребно да се уради, и кад год су те промене неопходне.
Као што је раније поменуто, бројеви опсега се такође могу користити у одређеним командама да би се променила променљива на различитим нивоима у односу на локални опсег. Ево исте скрипте која је коришћена у другом примеру горе, али са функцијом модификованом да користи команде Гет-Вариабле и Сет-Вариабле са бројевима опсега уместо директног упућивања на променљиву са именованим опсезима:
Функција ФунцтионСцопе "Промена $ МиВар у опсегу 0, у односу на ФунцтионСцопе ..." Сет-Вариабле МиВар "Ово је МиВар у опсегу функције 0." -Сцопе 0 'Промена $ МиВар у опсегу 1, у односу на ФунцтионСцопе ...' Сет-Вариабле МиВар 'МиВар је промењен у опсегу 1, из функције.' -Сцопе 1 'Промена $ МиВар у опсегу 2, у односу на Функционалност…' Сет-Вариабле МиВар 'МиВар је промењен у опсегу 2, из функције.' -Сцопе 2 "Цхецкинг $ МиВар у сваком опсегу ..." Област 0: 'Гет-Вариабле МиВар -Сцопе 0 -ВалуеОнли' Сцопе 1: 'Гет-Вариабле МиВар -Сцопе 1 -ВалуеОнли' Сцопе 2: 'Гет-Вариабле МиВар -Сцопе 2 -ВалуеОнли "" Добијање тренутне вредности $ МиВар. " "МиВар каже $ МиВар" "Промена $ МиВар по скрипти." $ МиВар = 'Поставио сам га скриптом!' "МиВар каже $ МиВар" ФунцтионСцопе 'Провера $ МиВар из опсега скрипте пре излаза.' "МиВар каже $ МиВар" "
Као и раније, овде можемо да видимо како команде у једном опсегу могу да мењају објекте у свом родитељском опсегу.
Додатне Информације
Има још много тога што се може урадити са опсегом него што се може уклопити у овај чланак. Сцопес утичу на више од само варијабли, и још се много тога може научити о приватним опсезима и АллСцопе варијаблама. За више корисних информација, можете покренути следећу команду из ПоверСхелл-а:
Гет-Хелп абоут_сцопес
Иста датотека помоћи је доступна и на ТецхНет-у.
Сцопе имаге цредит: спадассин он опенцлипарт