Чому PowerShell ISE не ізолює змінні сценарію в межах сценарію?


12

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

Ось демонстрація на консолі. Я перевіряю, $xчи не визначено це у глобальній області, показую вміст, ScopeTest.ps1а потім запускаю його, і нарешті, я перевіряю, чи $xвизначено знову. Як очікувалося, $xвін створюється та використовується лише в межах сценарію та не зберігається в глобальному середовищі після припинення дії сценарію.

введіть тут опис зображення

У ISE це, здається, працює, якщо сценарій викликається за допомогою вікна консолі.

введіть тут опис зображення

Однак якщо я дійсно використовую кнопку "Запустити сценарій" або F5, змінні в сценарії зберігатимуться після його завершення.

введіть тут опис зображення

Це може зробити ускладнення написання та усунення несправностей, якщо сценарій передбачає, що він починається з чистого середовища (тобто: будь-які змінні, встановлені в сценарії, вже не повинні існувати.) Чому ISE поводиться таким чином?

Відповідь на це питання трошки торкається цієї теми, згадуючи "джерело крапок", але я сподіваюся отримати тут більш ретельне пояснення. Крім того, якщо існує документація щодо того, чому сценарій запускається в ISE інакше, ніж на консолі, було б непоганим також посилання.

Відповіді:


9

У своїх прикладах сценаріїв ви створили змінні, і ви їх не знищили в кінці сценарію. ISE створює живий екземпляр powerhell, який завантажує та запускає скрипт при натисканні кнопки run. Різниця полягає в тому, що інтегрована оболонка може продовжувати сценарій. Це ідеально підходить для налагодження середовища та для створення сценаріїв у процесі роботи. Таким чином, вам не доведеться продовжувати запускати сценарій знову і знову (є ситуації, коли це не було б ідеально), щоб переконатися, що працює наступний рядок коду. Ви набираєте її в оболонці, і якщо вона працює, ви додаєте її до розділу сценарію.

Ця поведінка, можливо, найкраще описана тут: http://technet.microsoft.com/en-us/library/dd819480.aspx

Відповідна витяг:

Усі панелі в ISE завжди в одній області.

Якщо ви не хочете, щоб ваші змінні жили в оболонці після того, як ваш сценарій буде завершений, тоді вам слід Remove-Variableїх.

Наприклад:

Remove-Variable x

Ви можете додати "чистий" екземпляр повноважень до ISE, натиснувши Файл-> Нова вкладка Powershell


2

В ISE Powershell по суті скидає скрипт в оболонку, а потім запускає його. Ніби ви набрали його в оболонці, а потім виконали. Таким чином, змінна доступна для цього сеансу. Щоб побачити інші відмінності, перегляньте цю публікацію MSDN .


Я не бачу нічого у пов’язаному дописі, що стосується такої поведінки.
Іссі

0

тому ISE вважається глобальним. Якщо ви не видалите всі змінні, створені під час роботи в ISE, всі змінні будуть доступні після запуску сценарію. Коли я використовую ISE для створення мого сценарію, я завжди перевірятиму з відкритою іншою консоллю PowerShell. Це дозволяє мені переконатися, що все працює так, як я задумав.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.