Dlaczego PowerShell ISE nie izoluje zmiennych skryptu do zakresu skryptu?

12

W PowerShell, zakresowanie ma powstrzymywać obiekty (zmienne, aliasy, funkcje itp.) W skryptach przed wpływaniem na środowisko globalne. Wygląda na to, że działa dobrze w linii poleceń, ale nie w ISE.

Oto demonstracja w konsoli. Sprawdzam, $xczy nie jest zdefiniowany w zasięgu globalnym, wyświetlam zawartość, ScopeTest.ps1a następnie uruchamiam go, a na koniec sprawdzam, czy $xjest zdefiniowany ponownie. Zgodnie z oczekiwaniami $xjest tworzony i używany tylko w zakresie skryptu i nie utrzymuje się w środowisku globalnym po zakończeniu skryptu.

wprowadź opis zdjęcia tutaj

W ISE wydaje się, że działa, jeśli skrypt jest wywoływany za pomocą okna konsoli.

wprowadź opis zdjęcia tutaj

Jednak jeśli faktycznie użyję przycisku „Uruchom skrypt” lub F5, zmienne w skrypcie pozostaną po jego zakończeniu.

wprowadź opis zdjęcia tutaj

Może to utrudnić pisanie i rozwiązywanie problemów ze skryptami, jeśli skrypt zakłada, że ​​uruchomi się z czystego środowiska (tj .: Wszelkie zmienne ustawione w skrypcie nie powinny już istnieć.) Dlaczego ISE zachowuje się w ten sposób?

Odpowiedź na to pytanie lekko porusza ten temat, wspominając o „pozyskiwaniu kropek”, ale mam nadzieję uzyskać bardziej szczegółowe wyjaśnienie. Ponadto, jeśli istnieje dokumentacja wyjaśniająca, dlaczego skrypt jest uruchamiany inaczej w ISE niż w konsoli, referencja byłaby również przyjemna.

Iszi
źródło

Odpowiedzi:

9

W przykładach skryptu tworzyłeś zmienne i nie zniszczyłeś ich na końcu skryptu. ISE tworzy instancję na żywo programu PowerShell, która ładuje i uruchamia skrypt po kliknięciu przycisku Uruchom. Różnica polega na tym, że zintegrowana powłoka może kontynuować skrypt. Jest to idealne rozwiązanie do debugowania środowiska i tworzenia skryptów podczas pracy. W ten sposób nie musisz ciągle uruchamiać skryptu (są sytuacje, w których nie byłoby to idealne), aby upewnić się, że działa następny wiersz kodu. Wpisujesz go w powłoce, a jeśli działa, dodajesz go do sekcji skryptu.

To zachowanie najlepiej opisać tutaj: http://technet.microsoft.com/en-us/library/dd819480.aspx

Odpowiedni fragment:

Wszystkie panele w ISE są zawsze w tym samym zakresie.

Jeśli nie chcesz, aby zmienne żyły w powłoce po zakończeniu skryptu, powinieneś Remove-Variableje.

Na przykład:

Remove-Variable x

Możesz dodać „czystą” instancję PowerShell do ISE, klikając Plik-> Nowa karta PowerShell

Colyn1337
źródło
2

W ISE Powershell zasadniczo zrzuca skrypt do powłoki, a następnie uruchamia go. Jakby wpisałeś go w powłoce, a następnie wykonałeś. Tak więc zmienna jest dostępna dla tej sesji. Aby zobaczyć inne różnice, sprawdź ten post MSDN .

Unfundednut
źródło
W łączonym poście nie widzę nic, co dotyczyłoby tego zachowania.
Iszi
0

więc ISE ma zasięg globalny. O ile nie usuniesz wszystkich zmiennych utworzonych podczas pracy w ISE, wszystkie zmienne będą dostępne po uruchomieniu skryptu. Kiedy używam ISE do zbudowania skryptu, zawsze będę testować przy otwartej innej konsoli PowerShell. To pozwala mi upewnić się, że wszystko działa tak, jak zamierzałem.

TechGuyTJ
źródło