Acerca de los ámbitosAbout Scopes

Descripción breveShort description

Explica el concepto de ámbito en PowerShell y muestra cómo establecer y cambiar el ámbito de los elementos.Explains the concept of scope in PowerShell and shows how to set and change the scope of elements.

Descripción largaLong description

PowerShell protege el acceso a las variables, los alias, las funciones y las unidades de PowerShell (PSDrives) mediante la limitación de dónde se pueden leer y modificar.PowerShell protects access to variables, aliases, functions, and PowerShell drives (PSDrives) by limiting where they can be read and changed. PowerShell usa reglas de ámbito para asegurarse de que no se cambia accidentalmente un elemento que no debe cambiarse.PowerShell uses scope rules to ensure that you do not inadvertently change an item that should not be changed.

A continuación se muestran las reglas básicas de ámbito:The following are the basic rules of scope:

  • Los ámbitos pueden anidarse.Scopes may nest. Un ámbito externo se conoce como ámbito principal.An outer scope is referred to as a parent scope. Los ámbitos anidados son ámbitos secundarios de ese elemento primario.Any nested scopes are child scopes of that parent.

  • Un elemento está visible en el ámbito en el que se creó y en cualquier ámbito secundario, a menos que lo haga privado explícitamente.An item is visible in the scope in which it was created and in any child scopes, unless you explicitly make it private. Puede colocar variables, alias, funciones o unidades de PowerShell en uno o más ámbitos.You can place variables, aliases, functions, or PowerShell drives in one or more scopes.

  • Un elemento creado dentro de un ámbito solo se puede cambiar en el ámbito en el que se creó, a menos que se especifique explícitamente un ámbito diferente.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.

Si crea un elemento en un ámbito y el elemento comparte su nombre con un elemento en un ámbito diferente, el elemento original podría ocultarse en el nuevo elemento, pero no se invalidará ni cambiará.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.

Ámbitos de PowerShellPowerShell Scopes

PowerShell admite los siguientes ámbitos:PowerShell supports the following scopes:

  • Global: el ámbito que está en vigor cuando se inicia PowerShell o cuando se crea una nueva sesión o espacio de ejecución.Global: The scope that is in effect when PowerShell starts or when you create a new session or runspace. Las variables y funciones que están presentes cuando se inicia PowerShell se crean en el ámbito global, como variables automáticas y variables de preferencia.Variables and functions that are present when PowerShell starts have been created in the global scope, such as automatic variables and preference variables. Las variables, los alias y las funciones de los perfiles de PowerShell también se crean en el ámbito global.The variables, aliases, and functions in your PowerShell profiles are also created in the global scope. El ámbito global es el ámbito primario raíz de una sesión.The global scope is the root parent scope in a session.

  • Local: el ámbito actual.Local: The current scope. El ámbito local puede ser el ámbito global o cualquier otro ámbito.The local scope can be the global scope or any other scope.

  • Script: el ámbito que se crea cuando se ejecuta un archivo de script.Script: The scope that is created while a script file runs. Solo los comandos del script se ejecutan en el ámbito del script.Only the commands in the script run in the script scope. En los comandos de un script, el ámbito del script es el ámbito local.To the commands in a script, the script scope is the local scope.

Nota

Private no es un ámbito.Private is not a scope. Es una opción que cambia la visibilidad de un elemento fuera del ámbito en el que se define el elemento.It is an option that changes the visibility of an item outside of the scope where the item is defined.

Ámbitos primarios y secundariosParent and Child Scopes

Puede crear un nuevo ámbito secundario llamando a un script o una función.You can create a new child scope by calling a script or function. El ámbito de la llamada es el ámbito principal.The calling scope is the parent scope. El script o la función a los que se llama es el ámbito secundario.The called script or function is the child scope. Las funciones o los scripts a los que se llama pueden llamar a otras funciones, creando una jerarquía de ámbitos secundarios cuyo ámbito raíz es el ámbito global.The functions or scripts you call may call other functions, creating a hierarchy of child scopes whose root scope is the global scope.

A menos que los elementos sean privados explícitamente, los elementos del ámbito principal están disponibles para el ámbito secundario.Unless you explicitly make the items private, the items in the parent scope are available to the child scope. Sin embargo, los elementos que se crean y cambian en el ámbito secundario no afectan al ámbito primario, a menos que se especifique explícitamente el ámbito al crear los elementos.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.

Nota

Las funciones de un módulo no se ejecutan en un ámbito secundario del ámbito de llamada.Functions from a module do not run in a child scope of the calling scope. Los módulos tienen su propio estado de sesión vinculado al ámbito global.Modules have their own session state that is linked to the global scope. Todo el código del módulo se ejecuta en una jerarquía específica del módulo de ámbitos que tiene su propio ámbito raíz.All module code runs in a module-specific hierarchy of scopes that has its own root scope.

HerenciaInheritance

Un ámbito secundario no hereda las variables, los alias y las funciones del ámbito primario.A child scope does not inherit the variables, aliases, and functions from the parent scope. A menos que un elemento sea privado, el ámbito secundario puede ver los elementos del ámbito primario.Unless an item is private, the child scope can view the items in the parent scope. Además, puede cambiar los elementos especificando explícitamente el ámbito principal, pero los elementos no forman parte del ámbito secundario.And, it can change the items by explicitly specifying the parent scope, but the items are not part of the child scope.

Sin embargo, un ámbito secundario se crea con un conjunto de elementos.However, a child scope is created with a set of items. Normalmente, incluye todos los alias que tienen la opción AllScope .Typically, it includes all the aliases that have the AllScope option. Esta opción se describe más adelante en este artículo.This option is discussed later in this article. Incluye todas las variables que tienen la opción AllScope , además de algunas variables automáticas.It includes all the variables that have the AllScope option, plus some automatic variables.

Para buscar los elementos de un ámbito determinado, use el parámetro de ámbito de Get-Variable o Get-Alias .To find the items in a particular scope, use the Scope parameter of Get-Variable or Get-Alias.

Por ejemplo, para obtener todas las variables en el ámbito local, escriba:For example, to get all the variables in the local scope, type:

Get-Variable -Scope local

Para obtener todas las variables en el ámbito global, escriba:To get all the variables in the global scope, type:

Get-Variable -Scope global

Modificadores de ámbitoScope Modifiers

Una variable, un alias o un nombre de función puede incluir cualquiera de los siguientes modificadores de ámbito opcionales:A variable, alias, or function name can include any one of the following optional scope modifiers:

  • global: : Especifica que el nombre existe en el ámbito global .global: - Specifies that the name exists in the Global scope.

  • local: : Especifica que el nombre existe en el ámbito local .local: - Specifies that the name exists in the Local scope. El ámbito actual es siempre el ámbito local .The current scope is always the Local scope.

  • private: : Especifica que el nombre es privado y solo está visible para el ámbito actual.private: - Specifies that the name is Private and only visible to the current scope.

  • script: : Especifica que el nombre existe en el ámbito del script .script: - Specifies that the name exists in the Script scope. El ámbito del script es el ámbito del archivo de script antecesor más próximo o global si no hay ningún archivo de script antecesor más cercano.Script scope is the nearest ancestor script file's scope or Global if there is no nearest ancestor script file.

  • using: : Se usa para tener acceso a las variables definidas en otro ámbito mientras se ejecutan scripts mediante cmdlets como Start-Job y Invoke-Command .using: - Used to access variables defined in another scope while running scripts via cmdlets like Start-Job and Invoke-Command.

  • workflow: : Especifica que el nombre existe dentro de un flujo de trabajo.workflow: - Specifies that the name exists within a workflow. Nota: los flujos de trabajo no se admiten en PowerShell Core.Note: Workflows are not supported in PowerShell Core.

  • <variable-namespace> -Un modificador creado por un proveedor de PSDrive de PowerShell.<variable-namespace> - A modifier created by a PowerShell PSDrive provider. Por ejemplo:For example:

    Espacio de nombresNamespace DescripciónDescription
    Alias: Alias definidos en el ámbito actualAliases defined in the current scope
    Env: Variables de entorno definidas en el ámbito actualEnvironment variables defined in the current scope
    Function: Funciones definidas en el ámbito actualFunctions defined in the current scope
    Variable: Variables definidas en el ámbito actualVariables defined in the current scope

El ámbito predeterminado para los scripts es el ámbito del script.The default scope for scripts is the script scope. El ámbito predeterminado para las funciones y los alias es el ámbito local, aunque se hayan definido en un script.The default scope for functions and aliases is the local scope, even if they are defined in a script.

Usar modificadores de ámbitoUsing scope modifiers

Para especificar el ámbito de una nueva variable, alias o función, use un modificador de ámbito.To specify the scope of a new variable, alias, or function, use a scope modifier.

La sintaxis de un modificador de ámbito en una variable es:The syntax for a scope modifier in a variable is:

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

La sintaxis de un modificador de ámbito en una función es:The syntax for a scope modifier in a function is:

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

El siguiente comando, que no usa un modificador de ámbito, crea una variable en el ámbito actual o local :The following command, which does not use a scope modifier, creates a variable in the current or local scope:

$a = "one"

Para crear la misma variable en el ámbito global , use el global: modificador de ámbito:To create the same variable in the global scope, use the scope global: modifier:

$global:a = "one"

Para crear la misma variable en el ámbito del script , use el script: modificador de ámbito:To create the same variable in the script scope, use the script: scope modifier:

$script:a = "one"

También puede usar un modificador de ámbito con funciones.You can also use a scope modifier with functions. La siguiente definición de función crea una función en el ámbito global :The following function definition creates a function in the global scope:

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

También puede usar modificadores de ámbito para hacer referencia a una variable en un ámbito diferente.You can also use scope modifiers to refer to a variable in a different scope. El siguiente comando hace referencia a la $test variable, en primer lugar en el ámbito local y, a continuación, en el ámbito global:The following command refers to the $test variable, first in the local scope and then in the global scope:

$test
$global:test

El Using: modificador de ámbitoThe Using: scope modifier

El uso de es un modificador de ámbito especial que identifica una variable local en un comando remoto.Using is a special scope modifier that identifies a local variable in a remote command. Sin un modificador, PowerShell espera que las variables de los comandos remotos se definan en la sesión remota.Without a modifier, PowerShell expects variables in remote commands to be defined in the remote session.

El Using modificador de ámbito se introduce en PowerShell 3,0.The Using scope modifier is introduced in PowerShell 3.0.

Para cualquier script o comando que se ejecute fuera de la sesión, se necesita el Using modificador de ámbito para insertar valores de variable del ámbito de la sesión que realiza la llamada, de modo que el código fuera de la sesión pueda tener acceso a ellos.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. El Using modificador de ámbito es compatible con los contextos siguientes:The Using scope modifier is supported in the following contexts:

  • Comandos ejecutados de forma remota, iniciados con Invoke-Command el uso de los parámetros ComputerName , hostname , SSHConnection o Session (sesión remota)Remotely executed commands, started with Invoke-Command using the ComputerName , HostName , SSHConnection or Session parameters (remote session)
  • Trabajos en segundo plano, iniciados con Start-Job (sesión fuera de proceso)Background jobs, started with Start-Job (out-of-process session)
  • Trabajos de subprocesos, iniciados a través Start-ThreadJob de o ForEach-Object -Parallel (sesión de subproceso independiente)Thread jobs, started via Start-ThreadJob or ForEach-Object -Parallel (separate thread session)

Dependiendo del contexto, los valores de variables incrustadas son copias independientes de los datos en el ámbito del llamador o las referencias a él.Depending on the context, embedded variable values are either independent copies of the data in the caller's scope or references to it. En las sesiones remotas y fuera de proceso, son siempre copias independientes.In remote and out-of-process sessions, they are always independent copies.

Para obtener más información, vea about_Remote_Variables.For more information, see about_Remote_Variables.

En las sesiones de subproceso, se pasan por referencia.In thread sessions, they are passed by reference. Esto significa que es posible modificar las variables de ámbito de llamada en un subproceso diferente.This means it is possible to modify call scope variables in a different thread. Para modificar de forma segura las variables requiere la sincronización de subprocesos.To safely modify variables requires thread synchronization.

Para obtener más información, consulte:For more information see:

Serialización de valores de variableSerialization of variable values

Los comandos ejecutados de forma remota y los trabajos en segundo plano se ejecutan fuera de proceso.Remotely executed commands and background jobs run out-of-process. Las sesiones fuera de proceso utilizan la serialización y deserialización basadas en XML para que los valores de las variables estén disponibles en los límites del proceso.Out-of-process sessions use XML-based serialization and deserialization to make the values of variables available across the process boundaries. El proceso de serialización convierte los objetos en un PSObject que contiene las propiedades de los objetos originales, pero no sus métodos.The serialization process converts objects to a PSObject that contains the original objects properties but not its methods.

Para un conjunto limitado de tipos, la deserialización rehidrata los objetos al tipo original.For a limited set of types, deserialization rehydrates objects back to the original type. El objeto rehidratado es una copia de la instancia del objeto original.The rehydrated object is a copy of the original object instance. Tiene las propiedades y los métodos de tipo.It has the type properties and methods. En el caso de los tipos simples, como System. version , la copia es exacta.For simple types, such as System.Version , the copy is exact. En el caso de los tipos complejos, la copia es imperfecta.For complex types, the copy is imperfect. Por ejemplo, los objetos de certificado rehidratados no incluyen la clave privada.For example, rehydrated certificate objects do not include the private key.

Las instancias de todos los demás tipos son instancias de PSObject .Instances of all other types are PSObject instances. La propiedad PSTypeNames contiene el nombre de tipo original precedido por deserializado , por ejemplo, Deserialized.SysTEM. Data. DataTableThe PSTypeNames property contains the original type name prefixed with Deserialized , for example, Deserialized.System.Data.DataTable

La opción AllScopeThe AllScope Option

Las variables y los alias tienen una propiedad Option que puede tomar un valor de AllScope.Variables and aliases have an Option property that can take a value of AllScope. Los elementos que tienen la propiedad AllScope se convierten en parte de los ámbitos secundarios que cree, aunque no son heredados retroactivamente por ámbitos primarios.Items that have the AllScope property become part of any child scopes that you create, although they are not retroactively inherited by parent scopes.

Un elemento que tiene la propiedad AllScope está visible en el ámbito secundario y forma parte de ese ámbito.An item that has the AllScope property is visible in the child scope, and it is part of that scope. Los cambios en el elemento de cualquier ámbito afectan a todos los ámbitos en los que se define la variable.Changes to the item in any scope affect all the scopes in which the variable is defined.

Administrar ámbitoManaging Scope

Varios cmdlets tienen un parámetro de ámbito que le permite obtener o establecer (crear y cambiar) elementos en un ámbito determinado.Several cmdlets have a Scope parameter that lets you get or set (create and change) items in a particular scope. Use el siguiente comando para buscar todos los cmdlets de la sesión que tienen un parámetro de ámbito :Use the following command to find all the cmdlets in your session that have a Scope parameter:

Get-Help * -Parameter scope

Para buscar las variables que están visibles en un ámbito determinado, use el Scope parámetro de Get-Variable .To find the variables that are visible in a particular scope, use the Scope parameter of Get-Variable. Las variables visibles incluyen variables globales, variables en el ámbito primario y variables en el ámbito actual.The visible variables include global variables, variables in the parent scope, and variables in the current scope.

Por ejemplo, el siguiente comando obtiene las variables que están visibles en el ámbito local:For example, the following command gets the variables that are visible in the local scope:

Get-Variable -Scope local

Para crear una variable en un ámbito determinado, use un modificador de ámbito o el parámetro de ámbito de Set-Variable .To create a variable in a particular scope, use a scope modifier or the Scope parameter of Set-Variable. El siguiente comando crea una variable en el ámbito global:The following command creates a variable in the global scope:

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

También puede usar el parámetro de ámbito de los New-Alias Set-Alias Get-Alias cmdlets, o para especificar el ámbito.You can also use the Scope parameter of the New-Alias, Set-Alias, or Get-Alias cmdlets to specify the scope. El siguiente comando crea un alias en el ámbito global:The following command creates an alias in the global scope:

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

Para obtener las funciones en un ámbito determinado, use el Get-Item cmdlet cuando esté en el ámbito.To get the functions in a particular scope, use the Get-Item cmdlet when you are in the scope. El Get-Item cmdlet no tiene un parámetro de ámbito .The Get-Item cmdlet does not have a Scope parameter.

Nota

En el caso de los cmdlets que usan el parámetro de ámbito , también puede hacer referencia a ámbitos por número.For the cmdlets that use the Scope parameter, you can also refer to scopes by number. El número describe la posición relativa de un ámbito a otro.The number describes the relative position of one scope to another. El ámbito 0 representa el ámbito actual, o local.Scope 0 represents the current, or local, scope. El ámbito 1 indica el ámbito primario inmediato.Scope 1 indicates the immediate parent scope. El ámbito 2 indica el elemento primario del ámbito principal, etc.Scope 2 indicates the parent of the parent scope, and so on. Los ámbitos numerados son útiles si ha creado muchos ámbitos recursivos.Numbered scopes are useful if you have created many recursive scopes.

Usar la notación de origen de punto con el ámbitoUsing Dot Source Notation with Scope

Los scripts y las funciones siguen todas las reglas de ámbito.Scripts and functions follow all the rules of scope. Los crea en un ámbito determinado y solo afectan a ese ámbito a menos que use un parámetro de cmdlet o un modificador de ámbito para cambiar ese ámbito.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.

Sin embargo, puede Agregar un script o una función al ámbito actual mediante el uso de la notación de origen de puntos.But, you can add a script or function to the current scope by using dot source notation. A continuación, cuando un script se ejecuta en el ámbito actual, las funciones, los alias y las variables que crea el script están disponibles en el ámbito actual.Then, when a script runs in the current scope, any functions, aliases, and variables that the script creates are available in the current scope.

Para agregar una función al ámbito actual, escriba un punto (.) y un espacio antes de la ruta de acceso y el nombre de la función en la llamada de función.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.

Por ejemplo, para ejecutar el script de Sample.ps1 desde el directorio C:\Scripts en el ámbito del script (el valor predeterminado para los scripts), use el siguiente comando: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

Para ejecutar el script Sample.ps1 en el ámbito local, use el siguiente comando:To run the Sample.ps1 script in the local scope, use the following command:

. c:\scripts.sample.ps1

Cuando se usa el operador de llamada (&) para ejecutar una función o un script, no se agrega al ámbito actual.When you use the call operator (&) to run a function or script, it is not added to the current scope. En el ejemplo siguiente se usa el operador de llamada:The following example uses the call operator:

& c:\scripts.sample.ps1

Puede leer más sobre el operador de llamada en about_operators.You can read more about the call operator in about_operators.

Los alias, las funciones o las variables que crea el script de Sample.ps1 no están disponibles en el ámbito actual.Any aliases, functions, or variables that the Sample.ps1 script creates are not available in the current scope.

Restricción sin ámbitoRestricting Without Scope

Algunos conceptos de PowerShell son similares a ámbito o interacción con el ámbito.A few PowerShell concepts are similar to scope or interact with scope. Estos conceptos se pueden confundir con el ámbito o el comportamiento del ámbito.These concepts may be confused with scope or the behavior of scope.

Las sesiones, los módulos y los mensajes anidados son entornos independientes, pero no son ámbitos secundarios del ámbito global en la sesión.Sessions, modules, and nested prompts are self-contained environments, but they are not child scopes of the global scope in the session.

SesionesSessions

Una sesión es un entorno en el que se ejecuta PowerShell.A session is an environment in which PowerShell runs. Cuando se crea una sesión en un equipo remoto, PowerShell establece una conexión persistente con el equipo remoto.When you create a session on a remote computer, PowerShell establishes a persistent connection to the remote computer. La conexión persistente permite usar la sesión para varios comandos relacionados.The persistent connection lets you use the session for multiple related commands.

Dado que una sesión es un entorno contenido, tiene su propio ámbito, pero una sesión no es un ámbito secundario de la sesión en la que se creó.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. La sesión se inicia con su propio ámbito global.The session starts with its own global scope. Este ámbito es independiente del ámbito global de la sesión.This scope is independent of the global scope of the session. Puede crear ámbitos secundarios en la sesión.You can create child scopes in the session. Por ejemplo, puede ejecutar un script para crear un ámbito secundario en una sesión.For example, you can run a script to create a child scope in a session.

MódulosModules

Puede usar un módulo de PowerShell para compartir y proporcionar herramientas de PowerShell.You can use a PowerShell module to share and deliver PowerShell tools. Un módulo es una unidad que puede contener cmdlets, scripts, funciones, variables, alias y otros elementos útiles.A module is a unit that can contain cmdlets, scripts, functions, variables, aliases, and other useful items. A menos que se defina explícitamente, no se puede obtener acceso a los elementos de un módulo fuera del módulo.Unless explicitly defined, the items in a module are not accessible outside the module. Por lo tanto, puede Agregar el módulo a la sesión y usar los elementos públicos sin preocuparse de que los demás elementos puedan invalidar los cmdlets, scripts, funciones y otros elementos de la sesión.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.

De forma predeterminada, los módulos se cargan en el nivel superior del Estado de sesión actual, no en el ámbito actual.By default, modules are loaded into the top-level of the current session state not the current scope. El estado de sesión actual podría ser un estado de sesión de módulo o el estado de sesión global.The current session state could be a module session state or the global session state. La adición de un módulo a una sesión no cambia el ámbito.Adding a module to a session does not change the scope. Si se encuentran en el ámbito global, los módulos se cargan en el estado de sesión global.If you are in the global scope, then modules are loaded into the global session state. Las exportaciones se colocan en las tablas globales.Any exports are placed into the global tables. Si carga Module2 desde Module1, Module2 se carga en el estado de sesión de Module1, no en el estado de sesión global.If you load module2 from within module1, module2 is loaded into the session state of module1 not the global session state. Las exportaciones de Module2 se colocan en la parte superior del estado de sesión Module1.Any exports from module2 are placed at the top of the module1 session state. Si utiliza Import-Module -Scope local , las exportaciones se colocan en el objeto de ámbito actual en lugar de en el nivel superior.If you use Import-Module -Scope local, then the exports are placed into the current scope object rather than at the top level. Si se encuentra en un módulo y usa Import-Module -Scope global (o Import-Module -Global ) para cargar otro módulo, el módulo y las exportaciones se cargan en el estado de sesión global en lugar del estado de sesión local del módulo.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. Esta característica se diseñó para escribir un módulo que manipule módulos.This feature was designed for writing module that manipulate modules. El módulo WindowsCompatibility lo hace para importar los módulos de proxy en el estado de sesión global.The WindowsCompatibility module does this to import proxy modules into the global session state.

En el estado de la sesión, los módulos tienen su propio ámbito.Within the session state, modules have their own scope. Considere el siguiente módulo C:\temp\mod1.psm1 :Consider the following module C:\temp\mod1.psm1:

$a = "Hello"

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

Ahora se crea una variable global $a , se le asigna un valor y se llama a la función foo.Now we create a global variable $a, give it a value and call the function foo.

$a = "Goodbye"
foo

El módulo declara la variable $a en el ámbito del módulo y la función foo genera el valor de la variable en ambos ámbitos.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

Mensajes anidadosNested Prompts

Los mensajes anidados no tienen su propio ámbito.Nested prompts do not have their own scope. Cuando se escribe un símbolo del sistema anidado, el símbolo del sistema anidado es un subconjunto del entorno.When you enter a nested prompt, the nested prompt is a subset of the environment. Sin embargo, permanece dentro del ámbito local.But, you remain within the local scope.

Los scripts tienen su propio ámbito.Scripts do have their own scope. Si está depurando un script y llega a un punto de interrupción en el script, escriba el ámbito del script.If you are debugging a script, and you reach a breakpoint in the script, you enter the script scope.

Private, opciónPrivate Option

Los alias y las variables tienen una propiedad Option que puede tomar un valor de Private.Aliases and variables have an Option property that can take a value of Private. Los elementos que tienen la opción privada se pueden ver y cambiar en el ámbito en el que se crean, pero no se pueden ver o cambiar fuera de ese ámbito.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.

Por ejemplo, si crea una variable que tiene una opción privada en el ámbito global y, a continuación, ejecuta un script, los Get-Variable comandos del script no mostrarán la variable privada.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. El uso del modificador de ámbito global en esta instancia no muestra la variable privada.Using the global scope modifier in this instance does not display the private variable.

Puede usar el parámetro Option de los New-Variable Set-Variable New-Alias cmdlets,, y Set-Alias para establecer el valor de la propiedad Option en 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.

VisibilidadVisibility

La propiedad Visibility de una variable o alias determina si puede ver el elemento fuera del contenedor, en el que se creó.The Visibility property of a variable or alias determines whether you can see the item outside the container, in which it was created. Un contenedor puede ser un módulo, un script o un complemento.A container could be a module, script, or snap-in. La visibilidad está diseñada para contenedores de la misma manera que el valor privado de la propiedad Option está diseñado para ámbitos.Visibility is designed for containers in the same way that the Private value of the Option property is designed for scopes.

La propiedad Visibility toma los valores Public y Private .The Visibility property takes the Public and Private values. Los elementos que tienen visibilidad privada se pueden ver y cambiar solo en el contenedor en el que se crearon.Items that have private visibility can be viewed and changed only in the container in which they were created. Si se agrega o se importa el contenedor, no se pueden ver ni modificar los elementos que tienen visibilidad privada.If the container is added or imported, the items that have private visibility cannot be viewed or changed.

Dado que la visibilidad está diseñada para contenedores, funciona de forma diferente en un ámbito.Because visibility is designed for containers, it works differently in a scope.

  • Si crea un elemento que tiene visibilidad privada en el ámbito global, no puede ver ni cambiar el elemento en ningún ámbito.If you create an item that has private visibility in the global scope, you cannot view or change the item in any scope.
  • Si intenta ver o cambiar el valor de una variable que tiene visibilidad privada, PowerShell devuelve un mensaje de error.If you try to view or change the value of a variable that has private visibility, PowerShell returns an error message.

Puede usar los New-Variable Set-Variable cmdlets y para crear una variable que tenga visibilidad privada.You can use the New-Variable and Set-Variable cmdlets to create a variable that has private visibility.

EjemplosExamples

Ejemplo 1: cambiar un valor de variable solo en un scriptExample 1: Change a Variable Value Only in a Script

El siguiente comando cambia el valor de la $ConfirmPreference variable en un script.The following command changes the value of the $ConfirmPreference variable in a script. El cambio no afecta al ámbito global.The change does not affect the global scope.

En primer lugar, para mostrar el valor de la $ConfirmPreference variable en el ámbito local, use el siguiente comando:First, to display the value of the $ConfirmPreference variable in the local scope, use the following command:

PS>  $ConfirmPreference
High

Cree un script de Scope.ps1 que contenga los siguientes comandos:Create a Scope.ps1 script that contains the following commands:

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

Ejecute el script.Run the script. El script cambia el valor de la $ConfirmPreference variable y, a continuación, informa de su valor en el ámbito del script.The script changes the value of the $ConfirmPreference variable and then reports its value in the script scope. La salida debería ser similar a la siguiente:The output should resemble the following output:

The value of $ConfirmPreference is Low.

A continuación, pruebe el valor actual de la $ConfirmPreference variable en el ámbito actual.Next, test the current value of the $ConfirmPreference variable in the current scope.

PS>  $ConfirmPreference
High

Este ejemplo muestra que los cambios en el valor de una variable en el ámbito de script no afectan al valor de la variable en el ámbito primario.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.

Ejemplo 2: ver un valor de variable en ámbitos diferentesExample 2: View a Variable Value in Different Scopes

Puede usar modificadores de ámbito para ver el valor de una variable en el ámbito local y en un ámbito principal.You can use scope modifiers to view the value of a variable in the local scope and in a parent scope.

En primer lugar, defina una $test variable en el ámbito global.First, define a $test variable in the global scope.

$test = "Global"

A continuación, cree un script de Sample.ps1 que defina la $test variable.Next, create a Sample.ps1 script that defines the $test variable. En el script, use un modificador de ámbito para hacer referencia a las versiones globales o locales de la $test variable.In the script, use a scope modifier to refer to either the global or local versions of the $test variable.

En Sample.ps1:In Sample.ps1:

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

Al ejecutar Sample.ps1, la salida debe ser similar a la siguiente: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.

Una vez completado el script, solo se define el valor global de $test en la sesión.When the script is complete, only the global value of $test is defined in the session.

PS>  $test
Global

Ejemplo 3: cambiar el valor de una variable en un ámbito primarioExample 3: Change the Value of a Variable in a Parent Scope

A menos que proteja un elemento mediante la opción Private u otro método, puede ver y cambiar el valor de una variable en un ámbito primario.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.

En primer lugar, defina una $test variable en el ámbito global.First, define a $test variable in the global scope.

$test = "Global"

A continuación, cree un script de Sample.ps1 que defina la $test variable.Next, create a Sample.ps1 script that defines the $test variable. En el script, use un modificador de ámbito para hacer referencia a las versiones globales o locales de la $test variable.In the script, use a scope modifier to refer to either the global or local versions of the $test variable.

En Sample.ps1:In Sample.ps1:

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

Una vez completado el script, se cambia el valor global de $test .When the script is complete, the global value of $test is changed.

PS>  $test
Local

Ejemplo 4: crear una variable privadaExample 4: Creating a Private Variable

Una variable privada es una variable que tiene una propiedad Option que tiene un valor de Private.A private variable is a variable that has an Option property that has a value of Private. El ámbito secundario hereda las variables privadas , pero solo se pueden ver o cambiar en el ámbito en el que se crearon.Private variables are inherited by the child scope, but they can only be viewed or changed in the scope in which they were created.

El siguiente comando crea una variable privada llamada $ptest en el ámbito local.The following command creates a private variable called $ptest in the local scope.

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

Puede mostrar y cambiar el valor de $ptest en el ámbito local.You can display and change the value of $ptest in the local scope.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

A continuación, cree un script de Sample.ps1 que contenga los siguientes comandos.Next, create a Sample.ps1 script that contains the following commands. El comando intenta mostrar y cambiar el valor de $ptest .The command tries to display and change the value of $ptest.

En Sample.ps1:In Sample.ps1:

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

La $ptest variable no está visible en el ámbito del script, la salida está vacía.The $ptest variable is not visible in the script scope, the output is empty.

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

Ejemplo 5: usar una variable local en un comando remotoExample 5: Using a Local Variable in a Remote Command

En el caso de las variables de un comando remoto creado en la sesión local, use el Using modificador de ámbito.For variables in a remote command created in the local session, use the Using scope modifier. PowerShell supone que las variables de comandos remotos se crearon en la sesión remota.PowerShell assumes that the variables in remote commands were created in the remote session.

La sintaxis es:The syntax is:

$Using:<VariableName>

Por ejemplo, los siguientes comandos crean una $Cred variable en la sesión local y, a continuación, usan la $Cred variable en un comando remoto: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}

El ámbito de uso se presentó en PowerShell 3,0.The Using scope was introduced in PowerShell 3.0. En PowerShell 2,0, para indicar que se ha creado una variable en la sesión local, use el siguiente formato de comando.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

Consulte tambiénSee also

about_Variablesabout_Variables

about_Environment_Variablesabout_Environment_Variables

about_Functionsabout_Functions

about_Script_Blocksabout_Script_Blocks

Start-ThreadJobStart-ThreadJob