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

12

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

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

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

В ISE это действительно работает, если скрипт вызывается из окна консоли.

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

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

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

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

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

Iszi
источник

Ответы:

9

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

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

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

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

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

Например:

Remove-Variable x

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

Colyn1337
источник
2

В ISE Powershell по сути выдает сценарий в оболочку и затем запускает его. Как будто вы набрали его в оболочке, а затем выполнили. Таким образом, переменная доступна для этого сеанса. Чтобы увидеть другие различия, проверьте этот пост MSDN .

Unfundednut
источник
Я не вижу ничего в связанном посте, касающемся этого поведения.
Изи
0

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

TechGuyTJ
источник