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, $x
czy nie jest zdefiniowany w zasięgu globalnym, wyświetlam zawartość, ScopeTest.ps1
a następnie uruchamiam go, a na koniec sprawdzam, czy $x
jest zdefiniowany ponownie. Zgodnie z oczekiwaniami $x
jest tworzony i używany tylko w zakresie skryptu i nie utrzymuje się w środowisku globalnym po zakończeniu skryptu.
W ISE wydaje się, że działa, jeśli skrypt jest wywoływany za pomocą okna konsoli.
Jednak jeśli faktycznie użyję przycisku „Uruchom skrypt” lub F5, zmienne w skrypcie pozostaną po jego zakończeniu.
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.
źródło
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.
źródło