Почему PowerShell ISE не изолирует переменные скрипта в области действия скрипта?

Почему PowerShell ISE не изолирует переменные скрипта в области действия скрипта?

В PowerShell область действия должна предотвращать влияние объектов (переменных, псевдонимов, функций и т. д.) в скриптах на глобальную среду. Похоже, это работает нормально в командной строке, но не в ISE.

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

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

В ISE это, по-видимому, работает, если скрипт вызывается с помощью окна консоли.

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

Однако если я действительно использую кнопку «Запустить скрипт» или F5, переменные внутри скрипта сохранятся после его завершения.

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

Это может немного затруднить написание и устранение неполадок в скриптах, если скрипт предполагает, что он будет запущен из чистой среды (т. е. любые переменные, заданные в скрипте, не должны уже существовать). Почему ISE ведет себя таким образом?

Ответ наэтот вопрослишь слегка затрагивает тему, упоминая "dot-sourcing", но я надеюсь получить здесь более подробное объяснение. Кроме того, если существует документация о том, почему скрипт запускается в ISE по-разному, чем из консоли, ссылка тоже была бы неплоха.

решение1

В примерах скриптов вы создали переменные и не уничтожили их в конце скрипта. ISE создает живой экземпляр PowerShell, который загружает и запускает скрипт, когда вы нажимаете «Выполнить». Разница в том, что интегрированная оболочка может продолжить скрипт. Это идеально подходит для отладки среды и создания скриптов по ходу дела. Таким образом, вам не придется снова и снова запускать скрипт (есть ситуации, когда это не идеально), чтобы убедиться, что следующая строка кода работает. Вы вводите ее в оболочке, и если она работает, вы добавляете ее в раздел скрипта.

Такое поведение, пожалуй, лучше всего описать здесь: http://technet.microsoft.com/en-us/library/dd819480.aspx

Соответствующая выдержка:

Все панели в ISE всегда находятся в одной области видимости.

Если вы не хотите, чтобы ваши переменные оставались в оболочке после завершения скрипта, то вам следует Remove-Variableэто сделать.

Например:

Remove-Variable x

Вы можете добавить «чистый» экземпляр PowerShell в ISE, нажав Файл->Новая вкладка Powershell.

решение2

В ISE Powershell по сути выгружает скрипт в оболочку и затем запускает его. Как будто вы набрали его в оболочке, а затем выполнили. Поэтому переменная доступна для этого сеанса. Чтобы увидеть другие различия, посмотрите этоМСДНпочта.

решение3

поэтому ISE имеет область действия Global. Если вы не удалите все переменные, созданные во время работы в ISE, все переменные будут доступны после запуска скрипта. Когда я использую ISE для сборки своего скрипта, я всегда проверяю его с другой открытой консолью PowerShell. Это позволяет мне убедиться, что все работает так, как я задумал.

Связанный контент