Zakresy — informacjeAbout Scopes

Krótki opisShort description

Wyjaśnia koncepcję zakresu w programie PowerShell i pokazuje, jak ustawić i zmienić zakres elementów.Explains the concept of scope in PowerShell and shows how to set and change the scope of elements.

Długi opisLong description

Program PowerShell chroni dostęp do zmiennych, aliasów, funkcji i dysków programu PowerShell (PSDrives) przez ograniczenie miejsca, w którym można je odczytać i zmienić.PowerShell protects access to variables, aliases, functions, and PowerShell drives (PSDrives) by limiting where they can be read and changed. Program PowerShell stosuje reguły zakresu, aby upewnić się, że nie zmienia się przypadkowo elementu, który nie powinien być zmieniany.PowerShell uses scope rules to ensure that you do not inadvertently change an item that should not be changed.

Poniżej przedstawiono podstawowe reguły zakresu:The following are the basic rules of scope:

  • Zakresy mogą zagnieżdżać.Scopes may nest. Zewnętrzny zakres jest nazywany zakresem nadrzędnym.An outer scope is referred to as a parent scope. Wszystkie zagnieżdżone zakresy są zakresami podrzędnymi tego elementu nadrzędnego.Any nested scopes are child scopes of that parent.

  • Element jest widoczny w zakresie, w którym został utworzony, i we wszystkich zakresach podrzędnych, chyba że jawnie postanowisz go jako prywatny.An item is visible in the scope in which it was created and in any child scopes, unless you explicitly make it private. W co najmniej jednym z zakresów można umieścić zmienne, aliasy, funkcje lub dyski programu PowerShell.You can place variables, aliases, functions, or PowerShell drives in one or more scopes.

  • Element utworzony w ramach zakresu można zmienić tylko w zakresie, w którym został utworzony, chyba że jawnie określono inny zakres.An item that you created within a scope can be changed only in the scope in which it was created, unless you explicitly specify a different scope.

Jeśli utworzysz element w zakresie, a element udostępni swoją nazwę elementowi w innym zakresie, oryginalny element może być ukryty pod nowym elementem, ale nie jest zastępowany ani zmieniany.If you create an item in a scope, and the item shares its name with an item in a different scope, the original item might be hidden under the new item, but it is not overridden or changed.

Zakresy programu PowerShellPowerShell Scopes

Program PowerShell obsługuje następujące zakresy:PowerShell supports the following scopes:

  • Globalny: zakres obowiązujący podczas uruchamiania programu PowerShell lub tworzenia nowej sesji lub obszaru działania.Global: The scope that is in effect when PowerShell starts or when you create a new session or runspace. Zmienne i funkcje, które są obecne podczas uruchamiania programu PowerShell, zostały utworzone w zakresie globalnym, na przykład zmienne automatyczne i zmienne preferencji.Variables and functions that are present when PowerShell starts have been created in the global scope, such as automatic variables and preference variables. Zmienne, aliasy i funkcje w profilach programu PowerShell są również tworzone w zakresie globalnym.The variables, aliases, and functions in your PowerShell profiles are also created in the global scope. Zakres globalny jest głównym zakresem nadrzędnym sesji.The global scope is the root parent scope in a session.

  • Local: bieżący zakres.Local: The current scope. Zakres lokalny może być zakresem globalnym lub dowolnym innym zakresem.The local scope can be the global scope or any other scope.

  • Skrypt: zakres, który jest tworzony podczas uruchamiania pliku skryptu.Script: The scope that is created while a script file runs. Tylko polecenia w skrypcie są uruchamiane w zakresie skryptu.Only the commands in the script run in the script scope. Do poleceń w skrypcie zakres skryptów jest zakresem lokalnym.To the commands in a script, the script scope is the local scope.

Uwaga

Prywatny nie jest zakresem.Private is not a scope. Jest to opcja , która zmienia widoczność elementu poza zakresem, w którym jest zdefiniowany element.It is an option that changes the visibility of an item outside of the scope where the item is defined.

Zakresy nadrzędne i podrzędneParent and Child Scopes

Nowy zakres podrzędny można utworzyć, wywołując skrypt lub funkcję.You can create a new child scope by calling a script or function. Zakres wywoływania jest zakresem nadrzędnym.The calling scope is the parent scope. Nazwany skrypt lub funkcja jest zakresem podrzędnym.The called script or function is the child scope. Wywołania funkcji lub skryptów mogą wywołać inne funkcje, tworząc hierarchię zakresów podrzędnych, której zakresem głównym jest zakres globalny.The functions or scripts you call may call other functions, creating a hierarchy of child scopes whose root scope is the global scope.

O ile jawnie nie utworzysz elementów prywatnych, elementy w zakresie nadrzędnym są dostępne dla zakresu podrzędnego.Unless you explicitly make the items private, the items in the parent scope are available to the child scope. Jednak elementy tworzone i zmieniane w zakresie podrzędnym nie wpływają na zakres nadrzędny, chyba że jawnie określisz zakres podczas tworzenia elementów.However, items that you create and change in the child scope do not affect the parent scope, unless you explicitly specify the scope when you create the items.

Uwaga

Funkcje z modułu nie są uruchamiane w zakresie podrzędnym zakresu wywoływania.Functions from a module do not run in a child scope of the calling scope. Moduły mają własny stan sesji, który jest połączony z zakresem globalnym.Modules have their own session state that is linked to the global scope. Cały kod modułu jest uruchamiany w hierarchii zakresów, która ma swój własny zakres główny.All module code runs in a module-specific hierarchy of scopes that has its own root scope.

DziedziczenieInheritance

Zakres podrzędny nie dziedziczy zmiennych, aliasów ani funkcji z zakresu nadrzędnego.A child scope does not inherit the variables, aliases, and functions from the parent scope. O ile element nie jest prywatny, zakres podrzędny może wyświetlić elementy w zakresie nadrzędnym.Unless an item is private, the child scope can view the items in the parent scope. I można zmienić elementy przez jawne określenie zakresu nadrzędnego, ale elementy nie są częścią zakresu podrzędnego.And, it can change the items by explicitly specifying the parent scope, but the items are not part of the child scope.

Jednak zakres podrzędny jest tworzony z zestawem elementów.However, a child scope is created with a set of items. Zwykle zawiera wszystkie aliasy, które mają opcję AllScope .Typically, it includes all the aliases that have the AllScope option. Ta opcja została omówiona w dalszej części tego artykułu.This option is discussed later in this article. Zawiera wszystkie zmienne, które mają opcję AllScope oraz kilka automatycznych zmiennych.It includes all the variables that have the AllScope option, plus some automatic variables.

Aby znaleźć elementy w określonym zakresie, użyj parametru zakresu Get-Variable lub Get-Alias .To find the items in a particular scope, use the Scope parameter of Get-Variable or Get-Alias.

Na przykład aby uzyskać wszystkie zmienne w zakresie lokalnym, wpisz:For example, to get all the variables in the local scope, type:

Get-Variable -Scope local

Aby uzyskać wszystkie zmienne w zakresie globalnym, wpisz:To get all the variables in the global scope, type:

Get-Variable -Scope global

Modyfikatory zakresuScope Modifiers

Zmienna, alias lub nazwa funkcji może zawierać jeden z następujących opcjonalnych modyfikatorów zakresu:A variable, alias, or function name can include any one of the following optional scope modifiers:

  • global: -Określa, że nazwa istnieje w zakresie globalnym .global: - Specifies that the name exists in the Global scope.

  • local: -Określa, że nazwa istnieje w zakresie lokalnym .local: - Specifies that the name exists in the Local scope. Bieżący zakres jest zawsze zakresem lokalnym .The current scope is always the Local scope.

  • private: -Określa, że nazwa jest prywatna i widoczna tylko dla bieżącego zakresu.private: - Specifies that the name is Private and only visible to the current scope.

  • script: -Określa, że nazwa istnieje w zakresie skryptu .script: - Specifies that the name exists in the Script scope. Zakres skryptu jest najbliższym zakresem lub globalnym pliku skryptu nadrzędnego, jeśli nie istnieje najbliższy plik skryptu nadrzędnego.Script scope is the nearest ancestor script file's scope or Global if there is no nearest ancestor script file.

  • 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 .using: - Used to access variables defined in another scope while running scripts via cmdlets like Start-Job and Invoke-Command.

  • workflow: -Określa, że nazwa istnieje w ramach przepływu pracy.workflow: - Specifies that the name exists within a workflow. Uwaga: przepływy pracy nie są obsługiwane w programie PowerShell Core.Note: Workflows are not supported in PowerShell Core.

  • <variable-namespace> -Modyfikator utworzony przez dostawcę programu PowerShell PSDrive.<variable-namespace> - A modifier created by a PowerShell PSDrive provider. Na przykład:For example:

    Przestrzeń nazwNamespace OpisDescription
    Alias: Aliasy zdefiniowane w bieżącym zakresieAliases defined in the current scope
    Env: Zmienne środowiskowe zdefiniowane w bieżącym zakresieEnvironment variables defined in the current scope
    Function: Funkcje zdefiniowane w bieżącym zakresieFunctions defined in the current scope
    Variable: Zmienne zdefiniowane w bieżącym zakresieVariables defined in the current scope

Domyślnym zakresem dla skryptów jest zakres skryptów.The default scope for scripts is the script scope. Zakresem domyślnym dla funkcji i aliasów jest zakres lokalny, nawet jeśli są one zdefiniowane w skrypcie.The default scope for functions and aliases is the local scope, even if they are defined in a script.

Używanie modyfikatorów zakresuUsing scope modifiers

Aby określić zakres nowej zmiennej, aliasu lub funkcji, użyj modyfikatora zakresu.To specify the scope of a new variable, alias, or function, use a scope modifier.

Składnia modyfikatora zakresu w zmiennej to:The syntax for a scope modifier in a variable is:

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

Składnia modyfikatora zakresu w funkcji to:The syntax for a scope modifier in a function is:

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

Następujące polecenie, które nie używa modyfikatora zakresu, tworzy zmienną w zakresie bieżącym lub lokalnym :The following command, which does not use a scope modifier, creates a variable in the current or local scope:

$a = "one"

Aby utworzyć tę samą zmienną w zakresie globalnym , użyj global: modyfikatora Scope:To create the same variable in the global scope, use the scope global: modifier:

$global:a = "one"

Aby utworzyć tę samą zmienną w zakresie skryptu , użyj script: modyfikatora Scope:To create the same variable in the script scope, use the script: scope modifier:

$script:a = "one"

Można również użyć modyfikatora zakresu z funkcjami.You can also use a scope modifier with functions. Następująca definicja funkcji tworzy funkcję w zakresie globalnym :The following function definition creates a function in the global scope:

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

Można również użyć modyfikatorów zakresu, aby odwołać się do zmiennej w innym zakresie.You can also use scope modifiers to refer to a variable in a different scope. Następujące polecenie odwołuje się do $test zmiennej, najpierw w zakresie lokalnym, a następnie w zakresie globalnym:The following command refers to the $test variable, first in the local scope and then in the global scope:

$test
$global:test

Using:Modyfikator zakresuThe Using: scope modifier

Użycie jest specjalnym modyfikatorem zakresu, który identyfikuje zmienną lokalną w poleceniu zdalnym.Using is a special scope modifier that identifies a local variable in a remote command. Bez modyfikatora program PowerShell oczekuje zmiennych w poleceniach zdalnych, które mają być zdefiniowane w sesji zdalnej.Without a modifier, PowerShell expects variables in remote commands to be defined in the remote session.

UsingModyfikator zakresu jest wprowadzany w programie PowerShell 3,0.The Using scope modifier is introduced in PowerShell 3.0.

Dla dowolnego skryptu lub polecenia, które wykonuje sesję, potrzebny jest Using modyfikator zakresu, aby osadzić wartości zmiennych z zakresu sesji wywołującej, dzięki czemu kod sesji może uzyskiwać do nich dostęp.For any script or command that executes out of session, you need the Using scope modifier to embed variable values from the calling session scope, so that out of session code can access them. UsingModyfikator Scope jest obsługiwany w następujących kontekstach:The Using scope modifier is supported in the following contexts:

  • Polecenia wykonane zdalnie, rozpoczęte Invoke-Command przy użyciu parametrów ComputerName , hostname , SSHConnection lub Session (Sesja zdalna)Remotely executed commands, started with Invoke-Command using the ComputerName , HostName , SSHConnection or Session parameters (remote session)
  • Zadania w tle, uruchomione z Start-Job (pozaprocesowe sesji)Background jobs, started with Start-Job (out-of-process session)
  • Zadania wątków, rozpoczęte za pośrednictwem Start-ThreadJob lub ForEach-Object -Parallel (oddzielna sesja wątku)Thread jobs, started via Start-ThreadJob or ForEach-Object -Parallel (separate thread session)

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.Depending on the context, embedded variable values are either independent copies of the data in the caller's scope or references to it. W przypadku sesji zdalnych i pozaprocesowych są zawsze niezależnymi kopiami.In remote and out-of-process sessions, they are always independent copies.

Aby uzyskać więcej informacji, zobacz about_Remote_Variables.For more information, see about_Remote_Variables.

W sesjach wątków są one przesyłane przez odwołanie.In thread sessions, they are passed by reference. Oznacza to, że można modyfikować zmienne zakresu wywołań w innym wątku.This means it is possible to modify call scope variables in a different thread. Aby bezpiecznie zmodyfikować zmienne, wymagana jest synchronizacja wątków.To safely modify variables requires thread synchronization.

Aby uzyskać więcej informacji, zobacz:For more information see:

Serializacja wartości zmiennychSerialization of variable values

Zdalnie wykonywane polecenia i zadania w tle są uruchamiane poza procesem.Remotely executed commands and background jobs run out-of-process. Sesje pozaprocesowe używają serializacji opartej na języku XML i deserializacji w celu udostępnienia wartości zmiennych w granicach procesu.Out-of-process sessions use XML-based serialization and deserialization to make the values of variables available across the process boundaries. Proces serializacji Konwertuje obiekty na PSObject , które zawierają oryginalne właściwości obiektów, ale nie ich metody.The serialization process converts objects to a PSObject that contains the original objects properties but not its methods.

W przypadku ograniczonego zestawu typów deserializacja oddzieli obiekty z powrotem do oryginalnego typu.For a limited set of types, deserialization rehydrates objects back to the original type. Obiekt z dehydratacji jest kopią oryginalnego wystąpienia obiektu.The rehydrated object is a copy of the original object instance. Ma właściwości typu i metody.It has the type properties and methods. W przypadku typów prostych, takich jak System. Version , kopia jest dokładna.For simple types, such as System.Version , the copy is exact. W przypadku typów złożonych kopia jest nieskomplikowana.For complex types, the copy is imperfect. Na przykład obiekty certyfikatu, które zostały podwodne, nie zawierają klucza prywatnego.For example, rehydrated certificate objects do not include the private key.

Wystąpienia wszystkich innych typów są wystąpieniami PSObject .Instances of all other types are PSObject instances. Właściwość PSTypeNames zawiera oryginalną nazwę typu poprzedzoną deserializowaną , na przykład Deserialized.System. Data. DataTableThe PSTypeNames property contains the original type name prefixed with Deserialized , for example, Deserialized.System.Data.DataTable

Opcja AllScopeThe AllScope Option

Zmienne i aliasy mają właściwość Option , która może przyjmować wartość AllScope.Variables and aliases have an Option property that can take a value of AllScope. Elementy, które mają właściwość AllScope , stają się częścią wszystkich utworzonych przez Ciebie zakresów podrzędnych, chociaż nie są one dziedziczone wstecz przez zakresy nadrzędne.Items that have the AllScope property become part of any child scopes that you create, although they are not retroactively inherited by parent scopes.

Element, który ma właściwość AllScope , jest widoczny w zakresie podrzędnym i jest częścią tego zakresu.An item that has the AllScope property is visible in the child scope, and it is part of that scope. Zmiany elementu w dowolnym zakresie mają wpływ na wszystkie zakresy, w których zdefiniowana jest zmienna.Changes to the item in any scope affect all the scopes in which the variable is defined.

Zarządzanie zakresemManaging Scope

Kilka poleceń cmdlet ma parametr SCOPE , który umożliwia pobieranie lub Ustawianie (Tworzenie i zmienianie) elementów w określonym zakresie.Several cmdlets have a Scope parameter that lets you get or set (create and change) items in a particular scope. Użyj poniższego polecenia, aby znaleźć wszystkie polecenia cmdlet w sesji, które mają parametr SCOPE :Use the following command to find all the cmdlets in your session that have a Scope parameter:

Get-Help * -Parameter scope

Aby znaleźć zmienne, które są widoczne w określonym zakresie, użyj Scope parametru Get-Variable .To find the variables that are visible in a particular scope, use the Scope parameter of Get-Variable. Widoczne zmienne obejmują zmienne globalne, zmienne w zakresie nadrzędnym i zmienne w bieżącym zakresie.The visible variables include global variables, variables in the parent scope, and variables in the current scope.

Na przykład następujące polecenie pobiera zmienne, które są widoczne w zakresie lokalnym:For example, the following command gets the variables that are visible in the local scope:

Get-Variable -Scope local

Aby utworzyć zmienną w określonym zakresie, użyj modyfikatora zakresu lub parametru zakresu Set-Variable .To create a variable in a particular scope, use a scope modifier or the Scope parameter of Set-Variable. Następujące polecenie tworzy zmienną w zakresie globalnym:The following command creates a variable in the global scope:

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

Można również użyć parametru scope New-Alias Set-Alias poleceń cmdlet, lub, Get-Alias Aby określić zakres.You can also use the Scope parameter of the New-Alias, Set-Alias, or Get-Alias cmdlets to specify the scope. Następujące polecenie tworzy alias w zakresie globalnym:The following command creates an alias in the global scope:

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

Aby uzyskać funkcje w określonym zakresie, należy użyć Get-Item polecenia cmdlet w zakresie.To get the functions in a particular scope, use the Get-Item cmdlet when you are in the scope. Get-ItemPolecenie cmdlet nie ma parametru SCOPE .The Get-Item cmdlet does not have a Scope parameter.

Uwaga

Dla poleceń cmdlet, które korzystają z parametru SCOPE , można również odwoływać się do zakresów według numeru.For the cmdlets that use the Scope parameter, you can also refer to scopes by number. Liczba określa względne położenie jednego zakresu do innego.The number describes the relative position of one scope to another. Zakres 0 reprezentuje bieżący lub lokalny zakres.Scope 0 represents the current, or local, scope. Zakres 1 wskazuje bezpośredni zakres nadrzędny.Scope 1 indicates the immediate parent scope. Zakres 2 wskazuje element nadrzędny zakresu nadrzędnego i tak dalej.Scope 2 indicates the parent of the parent scope, and so on. Numerowane zakresy są przydatne, jeśli utworzono wiele zakresów cyklicznych.Numbered scopes are useful if you have created many recursive scopes.

Używanie notacji źródłowej dot z zakresemUsing Dot Source Notation with Scope

Skrypty i funkcje są zgodne ze wszystkimi regułami zakresu.Scripts and functions follow all the rules of scope. Można je utworzyć w określonym zakresie i wpływają tylko na zakres tego zakresu, chyba że do zmiany tego zakresu użyto parametru polecenia cmdlet lub modyfikatora zakresu.You create them in a particular scope, and they affect only that scope unless you use a cmdlet parameter or a scope modifier to change that scope.

Można jednak dodać skrypt lub funkcję do bieżącego zakresu przy użyciu notacji źródłowej kropki.But, you can add a script or function to the current scope by using dot source notation. Następnie, gdy skrypt jest uruchamiany w bieżącym zakresie, wszystkie funkcje, aliasy i zmienne tworzone przez skrypt są dostępne w bieżącym zakresie.Then, when a script runs in the current scope, any functions, aliases, and variables that the script creates are available in the current scope.

Aby dodać funkcję do bieżącego zakresu, wpisz kropkę (.) i spację przed ścieżką i nazwą funkcji w wywołaniu funkcji.To add a function to the current scope, type a dot (.) and a space before the path and name of the function in the function call.

Na przykład, aby uruchomić skrypt Sample.ps1 z katalogu C:\Scripts w zakresie skryptów (domyślnie dla skryptów), użyj następującego polecenia:For example, to run the Sample.ps1 script from the C:\Scripts directory in the script scope (the default for scripts), use the following command:

c:\scripts\sample.ps1

Aby uruchomić skrypt Sample.ps1 w zakresie lokalnym, użyj następującego polecenia:To run the Sample.ps1 script in the local scope, use the following command:

. c:\scripts.sample.ps1

Gdy używasz operatora wywołania (&) do uruchamiania funkcji lub skryptu, nie zostanie on dodany do bieżącego zakresu.When you use the call operator (&) to run a function or script, it is not added to the current scope. Poniższy przykład używa operatora call:The following example uses the call operator:

& c:\scripts.sample.ps1

Więcej informacji na temat operatora wywołania można znaleźć w about_operators.You can read more about the call operator in about_operators.

Wszelkie aliasy, funkcje i zmienne tworzone przez skrypt Sample.ps1 nie są dostępne w bieżącym zakresie.Any aliases, functions, or variables that the Sample.ps1 script creates are not available in the current scope.

Ograniczanie bez zakresuRestricting Without Scope

Niektóre koncepcje programu PowerShell są podobne do zakresu lub współdziałania z zakresem.A few PowerShell concepts are similar to scope or interact with scope. Te koncepcje mogą być pomylone z zakresem lub zachowaniem zakresu.These concepts may be confused with scope or the behavior of scope.

Sesje, moduły i zagnieżdżone monity są środowiskami niezależnymi, ale nie są to zakresy podrzędne zakresu globalnego w sesji.Sessions, modules, and nested prompts are self-contained environments, but they are not child scopes of the global scope in the session.

SesjeSessions

Sesja to środowisko, w którym działa program PowerShell.A session is an environment in which PowerShell runs. Podczas tworzenia sesji na komputerze zdalnym program PowerShell nawiązuje stałe połączenie z komputerem zdalnym.When you create a session on a remote computer, PowerShell establishes a persistent connection to the remote computer. Połączenie trwałe pozwala używać sesji dla wielu powiązanych poleceń.The persistent connection lets you use the session for multiple related commands.

Ponieważ sesja jest zawartym środowiskiem, ma swój własny zakres, ale sesja nie jest zakresem podrzędnym sesji, w której został utworzony.Because a session is a contained environment, it has its own scope, but a session is not a child scope of the session in which it was created. Sesja rozpoczyna się od własnego zakresu globalnego.The session starts with its own global scope. Ten zakres jest niezależny od globalnego zakresu sesji.This scope is independent of the global scope of the session. W sesji można tworzyć zakresy podrzędne.You can create child scopes in the session. Na przykład można uruchomić skrypt, aby utworzyć zakres podrzędny w sesji.For example, you can run a script to create a child scope in a session.

ModułyModules

Możesz użyć modułu programu PowerShell do udostępniania i dostarczania narzędzi programu PowerShell.You can use a PowerShell module to share and deliver PowerShell tools. Moduł jest jednostką, która może zawierać polecenia cmdlet, skrypty, funkcje, zmienne, aliasy i inne przydatne elementy.A module is a unit that can contain cmdlets, scripts, functions, variables, aliases, and other useful items. O ile nie określono jawnie, elementy w module nie są dostępne poza modułem.Unless explicitly defined, the items in a module are not accessible outside the module. W związku z tym można dodać moduł do sesji i używać elementów publicznych bez obaw, że inne elementy mogą przesłonić polecenia cmdlet, skrypty, funkcje i inne elementy w sesji.Therefore, you can add the module to your session and use the public items without worrying that the other items might override the cmdlets, scripts, functions, and other items in your session.

Domyślnie moduły są ładowane na najwyższego poziomu bieżącego stanu sesji , a nie w bieżącym zakresie.By default, modules are loaded into the top-level of the current session state not the current scope. Bieżący stan sesji może być stanem sesji modułu lub globalnym stanem sesji.The current session state could be a module session state or the global session state. Dodanie modułu do sesji nie powoduje zmiany zakresu.Adding a module to a session does not change the scope. Jeśli jesteś w zakresie globalnym, moduły są ładowane do globalnego stanu sesji.If you are in the global scope, then modules are loaded into the global session state. Wszystkie eksporty są umieszczane w tabelach globalnych.Any exports are placed into the global tables. Jeśli załadujesz Module2 z wewnątrz Module1, Module2 jest ładowany do stanu sesji Module1, a nie globalnego stanu sesji.If you load module2 from within module1, module2 is loaded into the session state of module1 not the global session state. Wszystkie eksporty z Module2 są umieszczane w górnej części stanu sesji Module1.Any exports from module2 are placed at the top of the module1 session state. Jeśli używasz Import-Module -Scope local , eksporty są umieszczane w bieżącym obiekcie zakresu, a nie na najwyższego poziomu.If you use Import-Module -Scope local, then the exports are placed into the current scope object rather than at the top level. Jeśli jesteś w module i używasz Import-Module -Scope global (lub Import-Module -Global ) do załadowania innego modułu, ten moduł i jego eksporty są ładowane do globalnego stanu sesji zamiast lokalnego stanu sesji modułu.If you are in a module and use Import-Module -Scope global (or Import-Module -Global) to load another module, that module and it's exports are loaded into the global session state instead of the module's local session state. Ta funkcja została zaprojektowana do pisania modułu, który operuje na modułach.This feature was designed for writing module that manipulate modules. Moduł WindowsCompatibility służy do importowania modułów proxy do globalnego stanu sesji.The WindowsCompatibility module does this to import proxy modules into the global session state.

W ramach stanu sesji moduły mają własny zakres.Within the session state, modules have their own scope. Rozważmy następujący moduł C:\temp\mod1.psm1 :Consider the following module C:\temp\mod1.psm1:

$a = "Hello"

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

Teraz tworzymy zmienną globalną $a , nadaj jej wartość i wywołaj funkcję foo.Now we create a global variable $a, give it a value and call the function foo.

$a = "Goodbye"
foo

Moduł deklaruje zmienną $a w zakresie modułu, a następnie funkcję foo wyprowadza wartość zmiennej w obu zakresach.The module declares the variable $a in the module scope then the function foo outputs the value of the variable in both scopes.

$a = Hello
$global:a = Goodbye

Zagnieżdżone poleceniaNested Prompts

Zagnieżdżone monity nie mają własnego zakresu.Nested prompts do not have their own scope. Gdy wprowadzisz zagnieżdżony monit, zagnieżdżony monit jest podzbiorem środowiska.When you enter a nested prompt, the nested prompt is a subset of the environment. Ale pozostanie w zakresie lokalnym.But, you remain within the local scope.

Skrypty mają własny zakres.Scripts do have their own scope. W przypadku debugowania skryptu i osiągnięcia punktu przerwania w skrypcie należy wprowadzić zakres skryptu.If you are debugging a script, and you reach a breakpoint in the script, you enter the script scope.

Opcja prywatnaPrivate Option

Aliasy i zmienne mają właściwość Option , która może przyjmować wartość prywatną.Aliases and variables have an Option property that can take a value of Private. Elementy, które mają opcję prywatną , można wyświetlać i zmieniać w zakresie, w którym są tworzone, ale nie mogą być wyświetlane ani zmieniane poza tym zakresem.Items that have the Private option can be viewed and changed in the scope in which they are created, but they cannot be viewed or changed outside that scope.

Na przykład jeśli utworzysz zmienną, która ma opcję prywatną w zakresie globalnym, a następnie uruchomisz skrypt, Get-Variable polecenia w skrypcie nie wyświetlają zmiennej prywatnej.For example, if you create a variable that has a private option in the global scope and then run a script, Get-Variable commands in the script do not display the private variable. Użycie modyfikatora zakresu globalnego w tym wystąpieniu nie powoduje wyświetlenia zmiennej prywatnej.Using the global scope modifier in this instance does not display the private variable.

Możesz użyć parametru Option New-Variable Set-Variable New-Alias poleceń cmdlet,,, i, Set-Alias Aby ustawić wartość właściwości Option na Private.You can use the Option parameter of the New-Variable, Set-Variable, New-Alias, and Set-Alias cmdlets to set the value of the Option property to Private.

WidocznośćVisibility

Właściwość widoczność zmiennej lub aliasu określa, czy można zobaczyć element poza kontenerem, w którym został utworzony.The Visibility property of a variable or alias determines whether you can see the item outside the container, in which it was created. Kontener może być modułem, skryptem lub przystawką.A container could be a module, script, or snap-in. Widoczność jest przeznaczona dla kontenerów w taki sam sposób, w jaki wartość Private właściwości Option jest zaprojektowana dla zakresów.Visibility is designed for containers in the same way that the Private value of the Option property is designed for scopes.

Właściwość Visibility przyjmuje wartości publiczne i prywatne .The Visibility property takes the Public and Private values. Elementy, które mają widoczność prywatną, mogą być wyświetlane i zmieniane tylko w kontenerze, w którym zostały utworzone.Items that have private visibility can be viewed and changed only in the container in which they were created. W przypadku dodania lub zaimportowania kontenera elementy, które mają widoczność prywatną, nie mogą być wyświetlane ani zmieniane.If the container is added or imported, the items that have private visibility cannot be viewed or changed.

Ponieważ widoczność jest zaprojektowana dla kontenerów, działa inaczej w zakresie.Because visibility is designed for containers, it works differently in a scope.

  • Jeśli utworzysz element, który ma prywatną widoczność w zakresie globalnym, nie można wyświetlać ani zmieniać elementu w żadnym zakresie.If you create an item that has private visibility in the global scope, you cannot view or change the item in any scope.
  • Jeśli spróbujesz wyświetlić lub zmienić wartość zmiennej, która ma widoczność prywatną, program PowerShell zwraca komunikat o błędzie.If you try to view or change the value of a variable that has private visibility, PowerShell returns an error message.

Za pomocą New-Variable Set-Variable poleceń cmdlet i można utworzyć zmienną, która ma widoczność prywatną.You can use the New-Variable and Set-Variable cmdlets to create a variable that has private visibility.

PrzykładyExamples

Przykład 1: zmiana wartości zmiennej tylko w skrypcieExample 1: Change a Variable Value Only in a Script

Następujące polecenie zmienia wartość $ConfirmPreference zmiennej w skrypcie.The following command changes the value of the $ConfirmPreference variable in a script. Zmiana nie ma wpływu na zakres globalny.The change does not affect the global scope.

Najpierw, aby wyświetlić wartość $ConfirmPreference zmiennej w zakresie lokalnym, użyj następującego polecenia:First, to display the value of the $ConfirmPreference variable in the local scope, use the following command:

PS>  $ConfirmPreference
High

Utwórz skrypt Scope.ps1 zawierający następujące polecenia:Create a Scope.ps1 script that contains the following commands:

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

Uruchom skrypt.Run the script. Skrypt zmienia wartość $ConfirmPreference zmiennej, a następnie raportuje jej wartość w zakresie skryptu.The script changes the value of the $ConfirmPreference variable and then reports its value in the script scope. Dane wyjściowe powinny wyglądać podobnie do następujących:The output should resemble the following output:

The value of $ConfirmPreference is Low.

Następnie przetestuj bieżącą wartość $ConfirmPreference zmiennej w bieżącym zakresie.Next, test the current value of the $ConfirmPreference variable in the current scope.

PS>  $ConfirmPreference
High

Ten przykład pokazuje, że zmiany wartości zmiennej w zakresie skryptu nie wpływają na wartość zmiennej w zakresie nadrzędnym.This example shows that changes to the value of a variable in the script scope does not affect the variable`s value in the parent scope.

Przykład 2: Wyświetlanie wartości zmiennej w różnych zakresachExample 2: View a Variable Value in Different Scopes

Można użyć modyfikatorów zakresu, aby wyświetlić wartość zmiennej w zakresie lokalnym i w zakresie nadrzędnym.You can use scope modifiers to view the value of a variable in the local scope and in a parent scope.

Najpierw Zdefiniuj $test zmienną w zakresie globalnym.First, define a $test variable in the global scope.

$test = "Global"

Następnie utwórz skrypt Sample.ps1, który definiuje $test zmienną.Next, create a Sample.ps1 script that defines the $test variable. W skrypcie Użyj modyfikatora zakresu, aby odwołać się do globalnej lub lokalnej wersji $test zmiennej.In the script, use a scope modifier to refer to either the global or local versions of the $test variable.

W Sample.ps1:In Sample.ps1:

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

Po uruchomieniu Sample.ps1 dane wyjściowe powinny wyglądać podobnie do następujących:When you run Sample.ps1, the output should resemble the following output:

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

Po zakończeniu działania skryptu $test w sesji jest definiowana tylko wartość globalna.When the script is complete, only the global value of $test is defined in the session.

PS>  $test
Global

Przykład 3: zmiana wartości zmiennej w zakresie nadrzędnymExample 3: Change the Value of a Variable in a Parent Scope

O ile nie zostanie włączona ochrona elementu przy użyciu opcji prywatnej lub innej metody, można wyświetlić i zmienić wartość zmiennej w zakresie nadrzędnym.Unless you protect an item by using the Private option or another method, you can view and change the value of a variable in a parent scope.

Najpierw Zdefiniuj $test zmienną w zakresie globalnym.First, define a $test variable in the global scope.

$test = "Global"

Następnie utwórz skrypt Sample.ps1, który definiuje $test zmienną.Next, create a Sample.ps1 script that defines the $test variable. W skrypcie Użyj modyfikatora zakresu, aby odwołać się do globalnej lub lokalnej wersji $test zmiennej.In the script, use a scope modifier to refer to either the global or local versions of the $test variable.

W Sample.ps1:In Sample.ps1:

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

Po zakończeniu działania skryptu wartość globalna $test jest zmieniana.When the script is complete, the global value of $test is changed.

PS>  $test
Local

Przykład 4: Tworzenie zmiennej prywatnejExample 4: Creating a Private Variable

Zmienna prywatna to zmienna, która ma właściwość Option , która ma wartość Private.A private variable is a variable that has an Option property that has a value of Private. Zmienne prywatne są dziedziczone przez zakres podrzędny, ale mogą być przeglądane lub zmieniane tylko w zakresie, w którym zostały utworzone.Private variables are inherited by the child scope, but they can only be viewed or changed in the scope in which they were created.

Następujące polecenie tworzy zmienną prywatną o nazwie $ptest w zakresie lokalnym.The following command creates a private variable called $ptest in the local scope.

New-Variable -Name ptest -Value 1 -Option private

Można wyświetlić i zmienić wartość $ptest w zakresie lokalnym.You can display and change the value of $ptest in the local scope.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

Następnie utwórz skrypt Sample.ps1 zawierający następujące polecenia.Next, create a Sample.ps1 script that contains the following commands. Polecenie próbuje wyświetlić i zmienić wartość $ptest .The command tries to display and change the value of $ptest.

W Sample.ps1:In Sample.ps1:

"The value of `$Ptest is $Ptest."
"The value of `$Ptest is $global:Ptest."

$ptestZmienna nie jest widoczna w zakresie skryptu, dane wyjściowe są puste.The $ptest variable is not visible in the script scope, the output is empty.

"The value of $Ptest is ."
"The value of $Ptest is ."

Przykład 5: użycie zmiennej lokalnej w poleceniu zdalnymExample 5: Using a Local Variable in a Remote Command

W przypadku zmiennych w poleceniu zdalnym utworzonym w sesji lokalnej należy użyć Using modyfikatora Scope.For variables in a remote command created in the local session, use the Using scope modifier. W programie PowerShell założono, że zmienne w poleceniach zdalnych zostały utworzone w sesji zdalnej.PowerShell assumes that the variables in remote commands were created in the remote session.

Składnia jest następująca:The syntax is:

$Using:<VariableName>

Na przykład następujące polecenia tworzą $Cred zmienną w lokalnej sesji, a następnie używają $Cred zmiennej w poleceniu zdalnym:For example, the following commands create a $Cred variable in the local session and then use the $Cred variable in a remote command:

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

Zakres korzystania został wprowadzony w programie PowerShell 3,0.The Using scope was introduced in PowerShell 3.0. W programie PowerShell 2,0, aby wskazać, że zmienna została utworzona w lokalnej sesji, użyj następującego formatu polecenia.In PowerShell 2.0, to indicate that a variable was created in the local session, use the following command format.

$Cred = Get-Credential
Invoke-Command $s {
  param($c)
  Remove-Item .\Test*.ps1 -Credential $c
} -ArgumentList $Cred

Zobacz teżSee also

about_Variablesabout_Variables

about_Environment_Variablesabout_Environment_Variables

about_Functionsabout_Functions

about_Script_Blocksabout_Script_Blocks

Start-ThreadJobStart-ThreadJob