Udostępnij za pośrednictwem


about_Scopes

Krótki opis

Objaśnienie pojęcia zakresu w programie PowerShell oraz sposób ustawiania i zmieniania zakresu elementów.

Długi opis

Program PowerShell chroni dostęp do zmiennych, aliasów, funkcji i dysków programu PowerShell (PSDrives), ograniczając miejsca ich odczytywania i zmieniania. Program PowerShell używa reguł zakresu, aby upewnić się, że nie wprowadzasz niezamierzonych zmian w elementach w innych zakresach.

Reguły zakresu

Po uruchomieniu programu PowerShell host (pwsh.exe) tworzy przestrzeń uruchomieniową programu PowerShell. Procesy hosta mogą mieć wiele przestrzeni uruchomieniowych. Każdy obszar uruchamiania ma własny stan sesji i kontenery zakresu. Nie można uzyskać dostępu do stanu sesji i zakresów w instancjach runspace.

Poniżej przedstawiono podstawowe reguły zakresu:

  • Zakresy mogą być zagnieżdżone. Zakres zewnętrzny jest określany jako zakres nadrzędny. Wszystkie zagnieżdżone zakresy są zakresami podrzędnymi tego zakresu nadrzędnego.
  • Element jest widoczny w zakresie, który został utworzony i w dowolnych zakresach podrzędnych, chyba że jawnie określisz go jako prywatny.
  • Za pomocą modyfikatorów zakresu można zadeklarować zmienne, aliasy, funkcje i dyski programu PowerShell dla zakresu poza bieżącym zakresem.
  • Element utworzony w zakresie można zmienić tylko w zakresie, w którym został utworzony, chyba że jawnie określisz inny zakres.
  • Gdy kod uruchomiony w przestrzeni uruchomieniowej odwołuje się do elementu, program PowerShell przeszukuje hierarchię zakresu, zaczynając od bieżącego zakresu i przechodząc przez każdy zakres nadrzędny.
    • Jeśli element nie zostanie znaleziony, nowy element zostanie utworzony w bieżącym zakresie.
    • Jeśli znajdzie dopasowanie, wartość elementu zostanie pobrana z zakresu, w którym został znaleziony.
    • Jeśli zmienisz wartość, element zostanie skopiowany do bieżącego zakresu, tak aby zmiana wpływała tylko na bieżący zakres.
  • Jeśli jawnie utworzysz element, który ma tę samą nazwę co element w innym zakresie, oryginalny element może zostać ukryty przez nowy element, ale nie zostanie on zastąpiony ani zmieniony.

Zakresy nadrzędne i podrzędne

Można utworzyć nowy zakres podrzędny, wywołując skrypt lub funkcję. Zakres wywołujący jest zakresem nadrzędnym. Nazywany skrypt lub funkcja jest zakresem podrzędnym. Wywoływane funkcje lub skrypty mogą wywoływać inne funkcje, tworząc hierarchię zakresów podrzędnych, których zakres główny jest zakresem globalnym.

Notatka

Funkcje z modułu nie są uruchamiane w zakresie podrzędnym zakresu wywołującego. Moduły mają własny stan sesji połączony z zakresem, w którym zaimportowano moduł. Cały kod modułu jest uruchamiany w hierarchii zakresów specyficznych dla modułu, która ma własny zakres główny. Aby uzyskać więcej informacji, zobacz sekcję Modules tego artykułu.

Po utworzeniu zakresu podrzędnego, zawiera on wszystkie aliasy i zmienne posiadające opcję AllScope oraz niektóre zmienne automatyczne. Ta opcja została omówiona w dalszej części tego artykułu.

Jeśli elementy nie zostaną jawnie oznaczone jako prywatne, elementy w zakresie nadrzędnym są dostępne w zakresie podrzędnym. Elementy tworzone lub zmieniane w zakresie podrzędnym nie mają wpływu na zakres nadrzędny, chyba że jawnie określisz zakres podczas tworzenia elementów.

Aby znaleźć elementy w określonym zakresie, użyj parametru Zakres Get-Variable lub Get-Alias.

Aby na przykład pobrać wszystkie zmienne w zakresie lokalnym, wpisz:

Get-Variable -Scope Local

Aby uzyskać wszystkie zmienne w zakresie globalnym, wpisz:

Get-Variable -Scope Global

Po utworzeniu odwołania do zmiennej, aliasu lub funkcji program PowerShell przeszukuje bieżący zakres. Jeśli element nie zostanie znaleziony, wyszukiwany jest zakres nadrzędny. To wyszukiwanie jest powtarzane aż do osiągnięcia zakresu globalnego. Jeśli zmienna jest prywatna w zakresie nadrzędnym, wyszukiwanie będzie kontynuowane przez łańcuch zakresów. Przykład 4 pokazuje efekt zmiennej prywatnej w wyszukiwaniu zakresu.

Nazwy zakresów programu PowerShell

Program PowerShell definiuje nazwy niektórych zakresów, aby umożliwić łatwiejszy dostęp do tego zakresu. Program PowerShell definiuje następujące nazwane zakresy:

  • Globalny: zakres, który jest aktywny podczas uruchamiania programu PowerShell lub podczas tworzenia nowej sesji czy przestrzeni uruchamiania. Zmienne i funkcje, które są obecne podczas uruchamiania programu PowerShell, takie jak zmienne automatyczne i zmienne preferencji, są tworzone w zakresie globalnym. Zmienne, aliasy i funkcje w profilach programu PowerShell są również tworzone w zakresie globalnym. Zakres globalny jest głównym zakresem nadrzędnym w przestrzeni uruchomieniowej.
  • Lokal: Bieżący zakres. Zakres lokalny może być zakresem globalnym lub dowolnym innym zakresem.
  • Skrypt: zakres utworzony podczas uruchamiania pliku skryptu. Polecenia w skrycie są uruchamiane w zakresie skryptu. W przypadku komend w skrypcie, zakres skryptu to zakres lokalny.

W przypadku poleceń cmdlet, które wspierają zakresy, można odnosić się do zakresów przez liczbę opisującą względne położenie jednego zakresu względem drugiego. Zakres 0 określa bieżący (lokalny) zakres, zakres 1 jest elementem nadrzędnym bieżącego zakresu, zakres 2 jest dziadkiem bieżącego zakresu. Ten wzorzec kontynuuje się aż do osiągnięcia zakresu głównego.

Modyfikatory zakresu

Zmienna, alias lub nazwa funkcji może zawierać jedną z następujących opcjonalnych modyfikatorów zakresu:

  • Global: — określa to, że nazwa istnieje w globalnym zakresie .

  • Local: — określa, że nazwa istnieje w zakresie local. Aktualny zakres to zawsze Local. W przypadku korzystania z Local: modyfikatora zakresu program PowerShell nie wyszukuje zakresów nadrzędnych. Jeśli element istnieje w bieżącym zakresie, jest używany. Jeśli element nie istnieje w bieżącym zakresie, program PowerShell utworzy nowy element w bieżącym zakresie.

  • Private: — określa, że nazwa jest prywatna i widoczna tylko dla bieżącego zakresu.

    Notatka

    Private: nie jest zakresem. Jest to opcja , która zmienia dostępność elementu poza zakresem, w którym jest zdefiniowana.

  • Script: — określa, że nazwa istnieje w zakresie Script. Zakres skryptu jest zakresem najbliższego pliku skryptu przodka lub globalnej, jeśli nie ma pliku skryptu najbliższego przodka.

  • Using: — służy do uzyskiwania dostępu do zmiennych zdefiniowanych w innym zakresie podczas uruchamiania w sesjach zdalnych, zadaniach w tle lub zadaniach wątku.

  • Workflow: — określa, że nazwa istnieje w przepływie pracy. Uwaga: przepływy pracy nie są obsługiwane w programie PowerShell w wersji 6 lub nowszej.

  • <variable-namespace> — modyfikator utworzony przez dostawcę programu PowerShell PSDrive. Na przykład:

    Namespace Opis
    Alias: Aliasy zdefiniowane w aktualnym zakresie
    Env: Zmienne środowiskowe zdefiniowane w bieżącym zakresie
    Function: Funkcje zdefiniowane w bieżącym zakresie
    Variable: Zmienne zdefiniowane w bieżącym zakresie

Domyślnym zakresem skryptów jest zakres skryptu. Domyślnym zakresem funkcji oraz aliasów jest zakres lokalny, nawet jeśli są zdefiniowane w skrypcie.

Używanie modyfikatorów zakresu

Aby określić zakres nowej zmiennej, aliasu lub funkcji, użyj modyfikatora zakresu.

Składnia modyfikatora zakresu w zmiennej to:

$[<scope-modifier>:]<name> = <value>

Składnia modyfikatora zakresu w funkcji to:

function [<scope-modifier>:]<name> {<function-body>}

Następujące polecenie, które nie używa modyfikatora zakresu, tworzy zmienną w bieżącym zakresie lub lokalnym.

$a = "one"

Aby utworzyć tę samą zmienną w globalnym zakresie , użyj modyfikatora zakresu Global:.

$Global:a = "one"
Get-Variable a | Format-List *

Zwróć uwagę na wartości właściwości Widoczność i Opcje.

Name        : a
Description :
Value       : one
Visibility  : Public
Module      :
ModuleName  :
Options     : None
Attributes  : {}

Porównaj to ze zmienną prywatną:

$Private:pVar = 'Private variable'
Get-Variable pVar | Format-List *

Za pomocą modyfikatora zakresu Private: ustawia się właściwość Opcje na Private.

Name        : pVar
Description :
Value       : Private variable
Visibility  : Public
Module      :
ModuleName  :
Options     : Private
Attributes  : {}

Aby utworzyć tę samą zmienną w zakresie skryptu, użyj modyfikatora zakresu Script::

$Script:a = "one"

Można również użyć modyfikatora zakresu z funkcjami. Poniższa definicja funkcji tworzy funkcję w globalnym zakresie :

function Global:Hello {
  Write-Host "Hello, World"
}

Można również użyć modyfikatorów zakresu, aby odwoływać się do zmiennej w innym zakresie. Następujące polecenie odwołuje się do zmiennej $test, najpierw w zakresie lokalnym, a następnie w zakresie globalnym:

$test
$Global:test

Modyfikator zakresu Using:

Using to specjalny modyfikator zakresu, który identyfikuje zmienną lokalną w poleceniu zdalnym. Bez modyfikatora program PowerShell oczekuje, że zmienne w poleceniach zdalnych zostaną zdefiniowane w sesji zdalnej.

Modyfikator zakresu Using: został wprowadzony w programie PowerShell 3.0.

W przypadku dowolnego skryptu lub polecenia wykonywanego poza sesją potrzebny jest modyfikator zakresu Using: do osadzania wartości zmiennych z zakresu sesji wywołującej, aby kod poza sesją mógł uzyskać do nich dostęp. Modyfikator zakresu Using: jest obsługiwany w następujących kontekstach:

  • Polecenia wykonywane zdalnie, rozpoczęte przy użyciu parametrów Invoke-Command, takich jak ComputerName, HostName, SSHConnection lub Sesja (sesja zdalna)
  • Zadania w tle, uruchomione w trybie sesji poza procesem, oznaczonym jako Start-Job
  • Zadania wątkowe, uruchamiane za pośrednictwem Start-ThreadJob lub ForEach-Object -Parallel (w oddzielnej sesji wątku)

W zależności od kontekstu osadzone wartości zmiennych są niezależnymi kopiami danych w zakresie obiektu wywołującego lub odwołaniami do niego. W sesjach zdalnych i oddzielnych od procesu zawsze są one niezależnymi kopiami.

Aby uzyskać więcej informacji, zajrzyj do about_Remote_Variables.

Odwołanie $Using: odnosi się tylko do wartości zmiennej. Jeśli chcesz zmienić wartość zmiennej w zakresie obiektu wywołującego, musisz mieć odwołanie do samej zmiennej. Aby utworzyć odwołanie do zmiennej, można uzyskać instancję zmiennej PSVariable. W poniższym przykładzie pokazano, jak utworzyć referencję i wprowadzić zmiany w zadaniu wątku.

$Count = 1
$refOfCount = Get-Variable Count

Start-ThreadJob {
    ($Using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob

$Count
2

Notatka

Nie jest to operacja bezpieczna wątkowo. Uszkodzenie danych można spowodować, jeśli spróbujesz zmienić wartość z wielu wątków jednocześnie. W celu ochrony udostępnionych danych należy użyć typów danych bezpiecznych wątkowo lub typów pierwotnych synchronizacji. Aby uzyskać więcej informacji, zobacz kolekcje Thread-Safe.

Serializacja wartości zmiennych

Zdalnie wykonywane polecenia i zadania w tle działają poza procesem. Sesje poza procesem używają serializacji i deserializacji opartej na języku XML w celu udostępnienia wartości zmiennych w granicach procesu. Proces serializacji konwertuje obiekty na PSObject, który zawiera oryginalne właściwości obiektów, ale nie jego metody.

W przypadku ograniczonego zestawu typów deserializacja przywraca obiekty z powrotem do oryginalnego typu. Rehydratyzowany obiekt jest kopią oryginalnego wystąpienia obiektu. Posiada typowe właściwości i metody. W przypadku prostych typów, takich jak System.Version, kopia jest dokładna. W przypadku typów złożonych kopia jest niedoskonała. Na przykład odtworzone obiekty certyfikatów nie zawierają klucza prywatnego.

Wystąpienia wszystkich innych typów są wystąpienia PSObject. Właściwość pstypenames zawiera oryginalną nazwę typu poprzedzoną prefiksem Deserialized, na przykład Deserialized.System.Data.DataTable

Opcja AllScope

Zmienne i aliasy mają właściwość Option, która może mieć wartość AllScope. Elementy, które mają właściwość AllScope stają się częścią tworzonych zakresów podrzędnych, chociaż nie są one dziedziczone wstecznie przez zakresy nadrzędne.

Element, który ma właściwość AllScope, jest widoczny w zakresie podrzędnym i jest częścią tego zakresu. Zmiany elementu w dowolnym zakresie mają wpływ na wszystkie zakresy, w których zdefiniowano zmienną.

Zarządzanie zakresem

Kilka cmdlet ma parametr Zakres, który umożliwia pobieranie lub ustawianie (zmienianie i tworzenie) elementów w określonym zakresie. Użyj następującego polecenia, aby znaleźć wszystkie polecenia cmdlet w sesji, które mają parametr zakresu:

Get-Help * -Parameter Scope

Aby znaleźć zmienne widoczne w określonym zakresie, użyj parametru ScopeGet-Variable. Widoczne zmienne obejmują zmienne globalne, zmienne w zakresie nadrzędnym i zmienne w bieżącym zakresie.

Na przykład następujące polecenie pobiera zmienne widoczne w zakresie lokalnym:

Get-Variable -Scope Local

Aby utworzyć zmienną w określonym zakresie, użyj modyfikatora zakresu lub parametru ZakresSet-Variable. Następujące polecenie tworzy zmienną w zakresie globalnym:

New-Variable -Scope Global -Name a -Value "One"

Możesz również użyć parametru Zakres poleceń cmdlet New-Alias, Set-Aliaslub Get-Alias do określenia zakresu. Następujące polecenie tworzy alias w zakresie globalnym:

New-Alias -Scope Global -Name np -Value Notepad.exe

Aby uzyskać funkcje w określonym zakresie, użyj polecenia cmdlet Get-Item, kiedy znajdujesz się w tym zakresie. Polecenie cmdlet Get-Item nie ma parametru zakresu .

Notatka

W przypadku poleceń cmdlet, które używają parametru zakresu , można również odwołać się do zakresów za pomocą numeru. Liczba opisuje względną pozycję jednego zakresu do drugiego. Zakres 0 reprezentuje bieżący lub lokalny zakres. Zakres 1 wskazuje bezpośredni zakres nadrzędny. Zakres 2 wskazuje element nadrzędny zakresu nadrzędnego itd. Zakresy numerowane są przydatne, jeśli utworzono wiele zakresów cyklicznych.

Używanie notacji dot-source z zakresem

Skrypty i funkcje są zgodne z regułami zakresu. Tworzysz je w określonym zakresie i mają one wpływ tylko na ten zakres, chyba że używasz parametru cmdlet lub modyfikatora zakresu, aby zmienić ten zakres.

Można jednak dodać zawartość skryptu lub funkcji do bieżącego zakresu przy użyciu notacji dot-source. Po uruchomieniu skryptu lub funkcji przy użyciu notacji dot-source jest on wykonywany w bieżącym zakresie. Wszystkie funkcje, aliasy i zmienne w skrycie lub funkcji są dodawane do bieżącego zakresu.

Aby na przykład uruchomić skrypt Sample.ps1 z katalogu C:\Scripts w zakresie skryptu (wartość domyślna dla skryptów), wystarczy wprowadzić pełną ścieżkę do pliku skryptu w wierszu polecenia.

C:\scripts\sample.ps1

Plik skryptu musi mieć rozszerzenie pliku .ps1, aby można go było wykonać. Pliki, które mają spacje w ścieżce, muszą być ujęte w cudzysłowy. Jeśli spróbujesz wykonać ścieżkę cytowaną, program PowerShell wyświetli zawartość cytowanego ciągu zamiast uruchamiać skrypt. Operator wywołania (&) umożliwia wykonanie zawartości ciągu zawierającego nazwę pliku.

Korzystanie z operatora wywołania do uruchomienia funkcji lub skryptu powoduje, że są one wykonywane w zakresie skryptu. Użycie operatora wywołania nie różni się od uruchamiania skryptu po nazwie.

& C:\scripts\sample.ps1

Więcej informacji na temat operatora połączeń można uzyskać w about_Operators.

Aby uruchomić skrypt Sample.ps1 w zakresie lokalnym, wpisz kropkę i spację (. ) przed ścieżką do skryptu:

. C:\scripts\sample.ps1

Teraz wszystkie funkcje, aliasy lub zmienne zdefiniowane w skrycie są dodawane do bieżącego zakresu.

Ograniczanie bez zakresu

Program PowerShell ma pewne opcje i funkcje podobne do zakresu i mogą wchodzić w interakcje z zakresami. Ta funkcja może być mylona z zakresem lub zachowaniem zakresu.

Sesje, moduły i zagnieżdżone prompty to środowiska samodzielne, a nie podrzędne zakresy globalnego zakresu w sesji.

Sesji

Sesja to środowisko, w którym działa program PowerShell. Podczas tworzenia sesji na komputerze zdalnym program PowerShell ustanawia trwałe połączenie z komputerem zdalnym. Trwałe połączenie umożliwia używanie sesji dla wielu powiązanych poleceń.

Ponieważ sesja jest środowiskiem zamkniętym, ma własny zakres, ale sesja nie jest zakresem podrzędnym względem sesji, w której została utworzona. Sesja rozpoczyna się od własnego zakresu globalnego. Ten zakres jest niezależny od globalnego zakresu sesji. Zakresy podrzędne można tworzyć w sesji. Można na przykład uruchomić skrypt, aby utworzyć zakres podrzędny w sesji.

Moduły

Moduł programu PowerShell umożliwia udostępnianie i dostarczanie narzędzi programu PowerShell. Moduł to jednostka, która może zawierać polecenia cmdlet, skrypty, funkcje, zmienne, aliasy i inne przydatne elementy. Jeśli nie zostaną jawnie wyeksportowane (przy użyciu Export-ModuleMember lub manifestu modułu), elementy w module nie będą dostępne poza modułem. W związku z tym możesz dodać moduł do swojej sesji i używać elementów publicznych bez obaw, że inne elementy mogą zastąpić polecenia cmdlet, skrypty, funkcje i inne elementy w twojej sesji.

Domyślnie moduły są ładowane do zakresu głównego (globalnego) obszaru uruchamiania. Importowanie modułu nie zmienia zakresu. W ramach sesji moduły mają własny zakres. Rozważmy następujący moduł C:\temp\mod1.psm1:

$a = "Hello"

function foo {
    "`$a = $a"
    "`$Global:a = $Global:a"
}

Teraz utworzymy zmienną globalną $a, nadaj jej wartość i wywołamy funkcję foo.

$a = "Goodbye"
foo

Moduł deklaruje zmienną $a w zakresie modułu, a następnie funkcja foo zwraca wartość zmiennej w obu zakresach.

$a = Hello
$Global:a = Goodbye

Moduły tworzą kontenery zakresu równoległego połączone z zakresem, w którym zostały zaimportowane. Elementy wyeksportowane przez moduł są dostępne od poziomu zakresu, w którym są importowane. Elementy nie wyeksportowane z modułu są dostępne tylko w kontenerze zakresu modułu. Funkcje w module mogą uzyskiwać dostęp do elementów w zakresie, w którym zostały zaimportowane, a także do elementów w kontenerze zakresu modułu.

Jeśli załadujesz Module2 z wModule1, Module2 zostanie załadowany do kontenera zakresu modułu Module1. Wszystkie eksporty z Module2 są umieszczane w zakresie bieżącego modułu Module1. Jeśli używasz Import-Module -Scope Local, eksportowane elementy są umieszczane w bieżącym obiekcie zakresu zamiast na poziomie głównym. Jeśli jesteś w module w module i załadujesz inny moduł przy użyciu Import-Module -Scope Global (lub Import-Module -Global), to ten moduł i jego eksporty zostaną załadowane do zakresu globalnego zamiast do lokalnego zakresu modułu. Funkcja WindowsCompatibility służy do importowania modułów proxy do globalnego stanu sesji.

Zagnieżdżone komunikaty

Zagnieżdżone monity nie mają własnego zakresu. Po wprowadzeniu zagnieżdżonego zapytania, jest ono podzbiorem środowiska. Pozostajesz jednak w lokalnym zasięgu.

Skrypty mają własny zakres. Jeśli debugujesz skrypt i osiągasz punkt przerwania w skrypcie, wchodzisz w zakres skryptu.

Opcja prywatna

Aliasy i zmienne mają właściwość Option, która może przyjmować wartość Private. Elementy, które mają opcję Private, można wyświetlać i zmieniać w zakresie, w którym zostały utworzone, ale nie można ich wyświetlać ani zmieniać poza tym zakresem.

Jeśli na przykład utworzysz zmienną z opcją prywatną w zakresie globalnym, a następnie uruchomisz skrypt, polecenia Get-Variable w skrypcie nie wyświetlają zmiennej prywatnej. Użycie modyfikatora zakresu Global: w tym wystąpieniu nie powoduje wyświetlenia zmiennej prywatnej.

Możesz użyć parametru Option w poleceniach New-Variable, Set-Variable, New-Aliasi Set-Alias cmdlet, aby ustawić wartość właściwości Option na Private.

Widoczność

Właściwość Widoczność zmiennej lub aliasu określa, czy można zobaczyć element poza kontenerem, w którym został utworzony. Kontenerem może być moduł, skrypt lub przystawka. Widoczność jest zaprojektowana dla kontenerów w taki sam sposób, w jaki wartość Private właściwości Opcji jest zaprojektowana dla zakresów.

Właściwość Widoczność przyjmuje wartości Public i Private. Elementy z prywatną widocznością można wyświetlać i zmieniać tylko w kontenerze, w którym zostały utworzone. Jeśli kontener zostanie dodany lub zaimportowany, nie można wyświetlić ani zmienić elementów z prywatną widocznością.

Ponieważ widoczność jest przeznaczona dla kontenerów, działa inaczej w zakresie.

  • Jeśli tworzysz element, który ma prywatną widoczność w zakresie globalnym, nie możesz wyświetlić ani zmienić elementu w żadnym zakresie.
  • Jeśli spróbujesz wyświetlić lub zmienić wartość zmiennej, która ma prywatną widoczność, program PowerShell zwróci komunikat o błędzie.

Możesz użyć poleceń cmdlet New-Variable i Set-Variable, aby utworzyć zmienną, która ma prywatną widoczność.

Przykłady

Przykład 1. Zmiana wartości zmiennej tylko w skrycie

Następujące polecenie zmienia wartość zmiennej $ConfirmPreference w skrycie. Zmiana nie ma wpływu na zakres globalny.

Najpierw, aby wyświetlić wartość zmiennej $ConfirmPreference w zakresie lokalnym, użyj następującego polecenia:

PS>  $ConfirmPreference
High

Utwórz skrypt Scope.ps1 zawierający następujące polecenia:

$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."

Uruchom skrypt. Skrypt zmienia wartość zmiennej $ConfirmPreference, a następnie raportuje jej wartość w zakresie skryptu. Dane wyjściowe powinny przypominać następujące dane wyjściowe:

The value of $ConfirmPreference is Low.

Następnie przetestuj bieżącą wartość zmiennej $ConfirmPreference w bieżącym zakresie.

PS>  $ConfirmPreference
High

W tym przykładzie pokazano, że zmiany wartości zmiennej w zakresie skryptu nie wpływają na wartość zmiennej w zakresie nadrzędnym.

Przykład 2. Wyświetlanie wartości zmiennej w różnych zakresach

Modyfikatory zakresu umożliwiają wyświetlanie wartości zmiennej w zakresie lokalnym i w zakresie nadrzędnym.

Najpierw zdefiniuj zmienną $test w zakresie globalnym.

$test = "Global"

Następnie utwórz skrypt Sample.ps1 definiujący zmienną $test. W skrypcie użyj modyfikatora zakresu, aby odwołać się do globalnych lub lokalnych wersji zmiennej $test.

W Sample.ps1:

$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $Global:test."

Po uruchomieniu Sample.ps1dane wyjściowe powinny przypominać następujące dane wyjściowe:

The local value of $test is Local.
The global value of $test is Global.

Po zakończeniu działania skryptu w sesji zdefiniowana jest tylko globalna wartość $test.

PS> $test
Global

Przykład 3. Zmiana wartości zmiennej w zakresie nadrzędnym

Jeśli element nie zostanie chroniony przy użyciu opcji Private lub innej metody, można wyświetlić i zmienić wartość zmiennej w zakresie nadrzędnym.

Najpierw zdefiniuj zmienną $test w zakresie globalnym.

$test = "Global"

Następnie utwórz skrypt Sample.ps1 definiujący zmienną $test. W skrypcie użyj modyfikatora zakresu, aby odwołać się do globalnych lub lokalnych wersji zmiennej $test.

W Sample.ps1:

$Global:test = "Local"
"The global value of `$test is $Global:test."

Po zakończeniu działania skryptu wartość globalna $test zostanie zmieniona.

PS> $test
Local

Przykład 4. Tworzenie zmiennej prywatnej

Zmienną można utworzyć prywatnie przy użyciu modyfikatora zakresu Private: lub tworząc zmienną z właściwością Option ustawioną na wartość Private. Zmienne prywatne można wyświetlać lub zmieniać tylko w zakresie, w którym zostały utworzone.

W tym przykładzie skrypt ScopeExample.ps1 tworzy pięć funkcji. Pierwsza funkcja wywołuje następną funkcję, która tworzy zakres podrzędny. Jedna z funkcji ma zmienną prywatną, która może być widoczna tylko w zakresie, w którym została utworzona.

PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
    "Setting `$funcAVar1 to 'Value set in funcA'"
    $funcAVar1 = "Value set in funcA"
    funcB
}

function funcB {
    "In funcB before set -> '$funcAVar1'"
    $Private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
    "In funcB after set  -> '$funcAVar1'"
    funcC
}

function funcC {
    "In funcC before set -> '$funcAVar1' - should be the value set in funcA"
    $funcAVar1 = "Value set in funcC - Child scopes can see this change."
    "In funcC after set  -> '$funcAVar1'"
    funcD
}

function funcD {
    "In funcD before set -> '$funcAVar1' - should be the value from funcC."
    $funcAVar1 = "Value set in funcD"
    "In funcD after set  -> '$funcAVar1'"
    '-------------------'
    ShowScopes
}

function ShowScopes {
    $funcAVar1 = "Value set in ShowScopes"
    "Scope [0] (local)  `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
    "Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
    "Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
    "Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
    "Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1

Dane wyjściowe pokazują wartość zmiennej w każdym zakresie. Widać, że zmienna prywatna jest widoczna tylko w funcB, w zakresie, w którym została utworzona.

Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set  -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set  -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set  -> 'Value set in funcD'
-------------------
Scope [0] (local)  $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'

Jak pokazano w danych wyjściowych z ShowScopes, można uzyskać dostęp do zmiennych z innych zakresów przy użyciu Get-Variable i określić numer zakresu.

Przykład 5: Używanie zmiennej lokalnej w poleceniu zdalnym

W przypadku zmiennych w zdalnym poleceniu utworzonym w sesji lokalnej użyj modyfikatora zakresu Using:. Program PowerShell zakłada, że zmienne w poleceniach zdalnych zostały utworzone w sesji zdalnej.

Składnia to:

$Using:<VariableName>

Na przykład następujące polecenia tworzą zmienną $Cred w sesji lokalnej, a następnie używają zmiennej $Cred w poleceniu zdalnym:

$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

Modyfikator zakresu Using: został wprowadzony w programie PowerShell 3.0.

Zobacz także