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 obszarów uruchamiania. 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 wystąpieniach obszaru uruchomieniowego.
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 elementu nadrzędnego.
- Element jest widoczny w zakresie, który został utworzony i w dowolnych zakresach podrzędnych, chyba że jawnie ustawisz go jako prywatny.
- Zmienne, aliasy, funkcje i dyski programu PowerShell można zadeklarować 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 udostępni jego nazwę elementowi w innym zakresie, oryginalny element może być 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.
Uwaga
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ę Moduły tego artykułu.
Po utworzeniu zakresu podrzędnego zawiera wszystkie aliasy i zmienne, które mają opcję AllScope , oraz niektóre zmienne automatyczne. Ta opcja została omówiona w dalszej części tego artykułu.
Jeśli nie zostaną jawnie udostępnione elementy prywatne, elementy w zakresie nadrzędnym są dostępne dla zakresu podrzędnego. 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 Scope parametru 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 zakresu globalnego. Jeśli zmienna jest prywatna w zakresie nadrzędnym, wyszukiwanie będzie kontynuowane przez łańcuch zakresów. Przykład 4 przedstawia 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 działa po uruchomieniu programu PowerShell lub podczas tworzenia nowej sesji lub obszaru 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.
- Lokalny: 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 poleceń w skrytecie zakres skryptu jest zakresem lokalnym.
W przypadku poleceń cmdlet, które obsługują zakresy, zakresy można odwoływać się przez liczbę opisjącą względną pozycję jednego zakresu do 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 będzie kontynuowany do momentu 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, że nazwa istnieje w zakresie globalnym .local:
- Określa, że nazwa istnieje w zakresie lokalnym . Bieżący zakres jest zawsze zakresem lokalnym .private:
- Określa, że nazwa jest prywatna i widoczna tylko dla bieżącego zakresu.Uwaga
private:
nie jest zakresem. Jest to opcja, która zmienia dostępność elementu poza zakresem, w którym jest zdefiniowany.script:
- Określa, że nazwa istnieje w zakresie Skrypt . Zakres skryptu to zakres najbliższego pliku skryptu modułu przodka lub plik globalny , 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:Przestrzeń nazw opis Alias:
Aliasy zdefiniowane w bieżącym 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 i aliasów jest zakres lokalny, nawet jeśli są zdefiniowane w skrytecie.
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 lub lokalnym zakresie:
$a = "one"
Aby utworzyć tę samą zmienną w zakresie globalnym , 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 *
private
Użycie modyfikatora zakresu ustawia właściwość Options na Private
wartość .
Name : pVar
Description :
Value : Private variable
Visibility : Public
Module :
ModuleName :
Options : Private
Attributes : {}
Aby utworzyć tę samą zmienną w zakresie skryptu script:
, użyj modyfikatora zakresu:
$script:a = "one"
Można również użyć modyfikatora zakresu z funkcjami. Poniższa definicja funkcji tworzy funkcję w zakresie globalnym :
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
using:
Modyfikator zakresu
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 using
zakresu jest wprowadzany w programie PowerShell 3.0.
W przypadku dowolnego skryptu lub polecenia, które wykonuje poza sesją, musisz using
modyfikator zakresu osadzić wartości zmiennych z zakresu sesji wywołującej, aby kod poza sesją mógł uzyskać do nich dostęp. Modyfikator using
zakresu jest obsługiwany w następujących kontekstach:
- Polecenia wykonywane zdalnie, rozpoczęte
Invoke-Command
przy użyciu parametrów ComputerName, HostName, SSHConnection lub Session (sesja zdalna) - Zadania w tle, rozpoczęte
Start-Job
od (sesja poza procesem) - Zadania wątku, uruchomione za pośrednictwem lub
Start-ThreadJob
ForEach-Object -Parallel
(oddzielna sesja 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 poza procesem zawsze są one niezależnymi kopiami.
Aby uzyskać więcej informacji, zobacz about_Remote_Variables.
Odwołanie $using:
rozszerza 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. Odwołanie do zmiennej można utworzyć, uzyskując wystąpienie zmiennej PSVariable . W poniższym przykładzie pokazano, jak utworzyć odwołanie 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
Uwaga
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 bezpieczne wątkowo.
Serializacja wartości zmiennych
Zdalnie wykonywane polecenia i zadania w tle kończą się 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 obiekt PSObject zawierający 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. Obiekt ponownie wypełniania jest kopią oryginalnego wystąpienia obiektu. Ma właściwości i metody typu. 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 obiekty certyfikatów ponownie wypełniania nie zawierają klucza prywatnego.
Wystąpienia wszystkich innych typów to wystąpienia obiektu PSObject . Właściwość PSTypeNames zawiera oryginalną nazwę typu poprzedzoną deserializowaną, na przykład Deserialized.System.Data.Data.DataTable
Opcja AllScope
Zmienne i aliasy mają właściwość Option , która może przyjmować wartość AllScope. Elementy, które mają właściwość AllScope , stają się częścią wszystkich utworzonych 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 poleceń cmdlet ma parametr Zakres , który umożliwia pobieranie lub ustawianie (tworzenie i zmienianie) elementów w określonym zakresie. Użyj następującego polecenia, aby znaleźć wszystkie polecenia cmdlet w sesji, które mają parametr Zakres :
Get-Help * -Parameter scope
Aby znaleźć zmienne widoczne w określonym zakresie, użyj parametru Scope
Get-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 Zakres .Set-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 New-Alias
Zakres poleceń cmdlet , Set-Alias
lub Get-Alias
, aby określić zakres. 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 Get-Item
polecenia cmdlet , gdy jesteś w zakresie. Polecenie Get-Item
cmdlet nie ma parametru Zakres .
Uwaga
W przypadku poleceń cmdlet, które używają parametru Zakres , można również odwołać się do zakresów według liczby. 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 uruchamiany w bieżącym zakresie. Wszystkie funkcje, aliasy i zmienne w skrycie lub funkcji są dodawane do bieżącego zakresu.
Aby na przykład uruchomić Sample.ps1
skrypt z C:\Scripts
katalogu 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 było plikiem wykonywalnym. 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.
Za pomocą operatora wywołania uruchomisz funkcję lub skrypt w zakresie skryptu. Użycie operatora wywołania nie różni się od uruchamiania skryptu według nazwy.
& c:\scripts\sample.ps1
Więcej informacji o operatorze połączeń można przeczytać w about_Operators.
Aby uruchomić Sample.ps1
skrypt 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 monity zagnieżdżone to środowiska samodzielne, a nie zakresy podrzędne zakresu globalnego w sesji.
Sesje
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 zawartym, ma własny zakres, ale sesja nie jest zakresem podrzędnym 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 sesji i użyć elementów publicznych bez obaw, że inne elementy mogą zastąpić polecenia cmdlet, skrypty, funkcje i inne elementy w 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ą $a
globalną , nadaj jej wartość i wywołamy obiekt foo funkcji.
$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 moduł Module2 z poziomu modułu Module1, moduł Module2 zostanie załadowany do kontenera zakresu modułu Module1. Wszystkie eksporty z modułu Module2 są umieszczane w bieżącym zakresie modułu Module1. Jeśli używasz Import-Module -Scope local
metody , eksporty są umieszczane w bieżącym obiekcie zakresu, a nie na najwyższym poziomie. Jeśli jesteś w module i załadujesz inny moduł przy użyciu Import-Module -Scope global
(lub Import-Module -Global
), ten moduł i jego eksporty są ładowane do zakresu globalnego zamiast zakresu lokalnego modułu.
Funkcja WindowsCompatibility umożliwia importowanie modułów proxy do stanu sesji globalnej.
Zagnieżdżone monity
Zagnieżdżone monity nie mają własnego zakresu. Po wprowadzeniu zagnieżdżonego monitu zagnieżdżony monit jest podzbiorem środowiska. Jednak pozostajesz w zakresie lokalnym.
Skrypty mają własny zakres. Jeśli debugujesz skrypt i osiągasz punkt przerwania w skry skrycie, wprowadź zakres skryptu.
Opcja prywatna
Aliasy i zmienne mają właściwość Option , która może przyjmować wartość Private
. Elementy, które mają Private
opcję, można wyświetlać i zmieniać w zakresie, w którym są tworzone, 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, Get-Variable
polecenia w skry skrycie nie wyświetlają zmiennej prywatnej. Użycie modyfikatora zakresu globalnego w tym wystąpieniu nie powoduje wyświetlenia zmiennej prywatnej.
Możesz użyć parametru Option poleceń New-Variable
cmdlet , Set-Variable
, New-Alias
i Set-Alias
, aby ustawić wartość właściwości Option na Private.
Widoczność
Właściwość Widoczność zmiennej lub aliasu określa, czy element znajduje się poza kontenerem, w którym został utworzony. Kontenerem może być moduł, skrypt lub przystawka. Widoczność jest przeznaczona dla kontenerów w taki sam sposób, jak Private
wartość właściwości Option jest przeznaczona dla zakresów.
Właściwość Widoczność przyjmuje Public
wartości 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.
Polecenia cmdlet i Set-Variable
umożliwiają New-Variable
utworzenie zmiennej, 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 Sample.ps1
skrypt, który definiuje zmienną $test
. W skrytecie użyj modyfikatora zakresu, aby odwołać się do globalnych lub lokalnych wersji zmiennej $test
.
W pliku Sample.ps1
:
$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."
Po uruchomieniu Sample.ps1
polecenia dane 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 wykonywania skryptu w sesji zdefiniowana jest tylko wartość $test
globalna .
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, który definiuje zmienną $test
. W skrytecie użyj modyfikatora zakresu, aby odwołać się do globalnych lub lokalnych wersji zmiennej $test
.
W pliku Sample.ps1:
$global:test = "Local"
"The global value of `$test is $global:test."
Po zakończeniu wykonywania skryptu wartość globalna elementu zostanie zmieniona $test
.
PS> $test
Local
Przykład 4. Tworzenie zmiennej prywatnej
Zmienną można utworzyć prywatnie przy użyciu private:
modyfikatora zakresu lub tworząc zmienną z właściwością Option ustawioną na Private
wartość . Zmienne prywatne można wyświetlać lub zmieniać tylko w zakresie, w którym zostały utworzone.
W tym przykładzie ScopeExample.ps1
skrypt 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
obszarze , 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
polecenia , można uzyskać dostęp do zmiennych z innych zakresów przy użyciu funkcji Get-Variable
i określania numeru zakresu.
Przykład 5: Używanie zmiennej lokalnej w poleceniu zdalnym
W przypadku zmiennych w zdalnym poleceniu utworzonym w sesji lokalnej użyj using
modyfikatora zakresu. Program PowerShell zakłada, że zmienne w poleceniach zdalnych zostały utworzone w sesji zdalnej.
Składnia jest następująca:
$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 using
zakresu został wprowadzony w programie PowerShell 3.0.