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 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 skryptów za pomocą poleceń cmdlet, takich jak Start-Job i Invoke-Command.

  • 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 Privatewartość .

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 przy użyciu parametrów ComputerName, HostName, SSH Połączenie ion lub Session (sesja zdalna)Invoke-Command
  • Zadania w tle, rozpoczęte Start-Job od (sesja poza procesem)
  • Zadania wątku, uruchomione za pośrednictwem lub Start-ThreadJobForEach-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.

W sesjach wątków są przekazywane przez odwołanie. Oznacza to, że można zmodyfikować zmienne zakresu podrzędnego w innym wątku. Aby bezpiecznie modyfikować zmienne, wymagana jest synchronizacja wątków.

Aby uzyskać więcej informacji, zobacz:

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 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 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-AliasZakres poleceń cmdlet , Set-Aliaslub 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ą $aglobalną , 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łuModule1, 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 localmetody , 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-Variablecmdlet , Set-Variable, New-Aliasi 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.ps1polecenia 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 Privatewartość . 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 funcBobszarze , 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 ShowScopespolecenia , 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.

Zobacz też