12

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

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

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

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

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

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

3 ответа3

9

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

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

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

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

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

Например:

Remove-Variable x

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

2

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .