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

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

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

enter image description here

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

enter image description here

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

enter image description here

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

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

23
задан Iszi
26.01.2023 14:36 Количество просмотров материала 2684
Распечатать страницу

3 ответа

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

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

Соответствующий Отрывок:

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

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

например:

Remove-Variable x

вы можете добавить "чистый" экземпляр powershell к ISE, щелкнув File - >New Powershell Tab

9
отвечен Colyn1337 2023-01-27 22:24

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

2
отвечен Unfundednut 2023-01-28 00:41

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

0
отвечен TechGuyTJ 2023-01-28 02:58

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх