Головна » як » Як сфери впливають на сценарії PowerShell

    Як сфери впливають на сценарії PowerShell

    У пакетних скриптах зміни змінних середовища мають глобальний вплив на поточний сеанс за замовчуванням. Для PowerShell вірно протилежне, тому що області використовуються для ізоляції модифікацій сценарію. Тут ми розглянемо, як сфери впливають на сценарії PowerShell і як працювати в них та навколо них.

    Що таке Сфера?

    У PowerShell "scope" відноситься до поточного середовища, в якому працює скрипт або командна оболонка. Області використовуються для захисту певних об'єктів у середовищі від ненавмисного зміни сценаріїв або функцій. Зокрема, наступні речі захищені від модифікації командами, що виконуються з іншої області, якщо не вказано інше параметрами цих команд:

    • Змінні
    • Псевдоніми
    • Функції
    • Диски PowerShell (PSDrives)

    Нові області застосування створюються, коли ви запускаєте сценарій або функцію, або коли створюєте новий сеанс або екземпляр PowerShell. Області, створені за допомогою запущених сценаріїв і функцій, мають відношення "батько / дитина" до області, з якої вони були створені. Є кілька областей, які мають особливе значення, і доступ до яких можна отримати за назвою:

    • The Глобальний scope - область, що створюється під час запуску PowerShell. Вона включає в себе змінні, псевдоніми, функції та PSDrives, вбудовані в PowerShell, а також будь-які, створені вашим профілем PowerShell.
    • The Місцеві Область відноситься до будь-якої поточної області. Коли ви запускаєте PowerShell, воно буде посилатися на глобальну область, у скрипті це буде область сценарію і т.д..
    • The Сценарій Область створюється, коли виконується сценарій. Єдині команди, які працюють у цій області, такі, що знаходяться в сценарії.
    • Приватний області можуть бути визначені в межах поточної області, щоб запобігти можливість читати або змінювати елементи, які вони могли б мати доступ до.

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

    Як сфери впливають на команди

    Як згадувалося раніше, команди, що виконуються в межах однієї області, не впливатимуть на речі в іншій області, якщо тільки це спеціально не сказано. Наприклад, якщо $ MyVar існує в глобальному масштабі, а скрипт виконує команду встановити $ MyVar на інше значення, то глобальна версія $ MyVar залишиться незмінною, тоді як копія $ MyVar буде поміщена в область сценарію з новим значення. Якщо $ MyVar не існує, скрипт створить його в межах області сценарію за замовчуванням - не в глобальній області. Це важливо пам'ятати, коли ви дізнаєтеся про фактичне відношення батьків / дитини між областями.

    Взаємозв'язок "батько / дитина" областей у PowerShell є одностороннім. Команди можуть переглядати і, при необхідності, змінювати поточну область видимості, її батьківську і будь-яку сферу дії вище. Однак вони не можуть бачити або змінювати речі в будь-яких дітях поточної області. Це пояснюється передусім тим, що після переміщення до батьківської області область дочірньої програми вже була знищена, оскільки вона виконала свою мету. Наприклад, чому ви повинні бачити або змінювати змінну в області сценарію, з глобальної області, після завершення сценарію? Там є багато випадків, коли вам потрібно змінити скрипт або функцію для збереження після його завершення, але не так багато, де потрібно внести зміни до об'єктів у межах скрипта або функції до або після його запуску. (Зазвичай такі речі обробляються як частина сценарію або функціонують самостійно.)

    Звичайно, які правила без винятків? Єдиним винятком з вищезазначених є приватні області. Об'єкти в приватних областях доступні тільки для команд, які виконуються в області, з якої вони були створені. Іншим важливим винятком є ​​елементи, які мають властивість AllScope. Це спеціальні змінні та псевдоніми, для яких зміна будь-якої сфери застосування вплине на всі області. Наступні команди покажуть вам, які змінні та псевдоніми мають властивість AllScope:

    Get-Variable | Де-об'єкт $ _. Опції -змінити '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 працювали так само, як і скрипти сценаріїв, ми очікуємо, що vale $ MyVar (або% MyVar% у пакетному синтаксисі) зміниться з "Я глобальна змінна!", На "Я отримав сценарій! і, нарешті, до "я отримав функцію!" де він залишиться, поки він явно не змінюється знову або сеанс не припиниться. Проте, подивіться, що насправді відбувається тут, коли ми переміщуємося по кожному з областей - зокрема, після того, як функція FunctionScope завершила свою роботу, і ми знову перевіряємо змінну зі скрипту, а пізніше - з глобальної.

    Як ви можете бачити, змінна з'явилася зміною, коли ми переходили через скрипт, тому що, доки функція FunctionScope не була завершена, ми перевіряли змінну з тієї ж самої сфери, в якій вона була останньою. Після того, як FunctionScope було зроблено, ми повернулися назад до області Script, де $ MyVar залишалася недоторканою функцією. Потім, коли скрипт завершився, ми повернулися назад до глобальної області, де вона взагалі не була змінена.

    Досягнення поза місцевим об'ємом

    Отже, це все добре, щоб допомогти вам уникнути випадкового внесення змін до навколишнього середовища поза межами ваших скриптів і функцій, але що, якщо ви дійсно хочете зробити такі зміни? Існує спеціальний і досить простий синтаксис для створення та зміни об'єктів за межами локальної області. Ви просто помістіть ім'я області дії на початку імені змінної і покладете двокрапку між іменем області і змінної. Подобається це:

    $ global: сценарій MyVar $: MyVar $ local: MyVar

    Модифікатори можна використовувати як при перегляді, так і при встановленні змінних. Давайте подивимося, що відбувається з цим демонстраційним сценарієм:

    Функція FunctionScope "Зміна $ MyVar в області локальної функції ... '$ local: MyVar =" Це MyVar в локальній області функції. "' Зміна $ MyVar в області сценарію ... '$ script: MyVar =' MyVar раніше Тепер встановлено функцією. "Зміна $ MyVar в глобальній області ..." $ global: MyVar = 'MyVar було встановлено в глобальній області. Тепер встановлено функцією. "Перевірка $ MyVar у кожній області ..." "Локальна: $ local: MyVar" "Сценарій: $ script: MyVar" "Global: $ global: MyVar" "" Отримання поточного значення $ MyVar. " "MyVar каже $ MyVar" "Зміна $ MyVar за сценарієм." $ MyVar = 'Я встановлений сценарієм!' "MyVar каже $ MyVar" FunctionScope "Перевірка $ MyVar з області сценарію перед виходом." "MyVar каже $ MyVar" "

    Як і раніше, ми почнемо встановлювати змінну в глобальному масштабі і закінчуватимемо перевіркою остаточного результату глобальної сфери.

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

    Як згадувалося раніше, номери діапазонів можуть також використовуватися в певних командах для модифікації змінної на різних рівнях по відношенню до локальної області. Ось той самий сценарій, який використовується у другому прикладі вище, але з функцією, модифікованою для використання команд Get-Variable і Set-Variable з номерами області, замість прямого посилання на змінну з названими областями:

    Функція FunctionScope "Зміна $ MyVar в області 0, щодо FunctionScope ..." Set-Variable MyVar "Це MyVar в області функції 0." -Scope 0 'Зміна $ MyVar в області 1, відносно FunctionScope ...' Set-Variable MyVar 'MyVar було змінено в області 1, з функції.' -Scope 1 'Зміна $ MyVar в області 2, відносно функціональності…' Set-Variable MyVar 'MyVar було змінено в області 2, з функції.' -Scope 2 "Перевірка $ MyVar в кожній області ..." Сфера 0: "Get-Variable MyVar -Scope 0 -ValueOnly" Сфера 1: "Get-Variable MyVar -Scope 1 -ValueOnly" Сфера 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" Отримання поточного значення $ MyVar. " "MyVar каже $ MyVar" "Зміна $ MyVar за сценарієм." $ MyVar = 'Я встановлений сценарієм!' "MyVar каже $ MyVar" FunctionScope "Перевірка $ MyVar з області сценарію перед виходом." "MyVar каже $ MyVar" "

    Подібно до раніше, ми бачимо, як команди в одній області можуть змінювати об'єкти у своїй батьківській області.

    Додаткова інформація

    Існує ще багато чого іншого, що можна зробити з областями, ніж можна вписати в цю статтю. Області впливають більше, ніж просто змінні, і ще багато чого потрібно дізнатися про приватні області та змінні AllScope. Для отримання додаткової корисної інформації можна виконати таку команду в PowerShell:

    Get-Help about_scopes

    Той же файл довідки також доступний на веб-сайті TechNet.


    Область зображення кредиту: spadassin on openclipart