В 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. Это позволяет мне убедиться, что все работает так, как я задумал.