Compartir a través de


Acerca de los ámbitos

Descripción breve

Explica el concepto de ámbito en PowerShell y muestra cómo establecer y cambiar el ámbito de los elementos.

Descripción larga

PowerShell protege el acceso a variables, alias, funciones y unidades de PowerShell (PSDrives) limitando dónde se pueden leer y cambiar. PowerShell usa reglas de ámbito para asegurarse de que no cambia accidentalmente un elemento que no se debe cambiar.

A continuación se muestran las reglas básicas del ámbito:

  • Los ámbitos pueden anidar. Un ámbito externo se conoce como ámbito primario. Los ámbitos anidados son ámbitos secundarios de ese elemento primario.

  • Un elemento está visible en el ámbito en el que se creó y en cualquier ámbito secundario, a menos que lo haga explícitamente privado. Puede colocar variables, alias, funciones o unidades de PowerShell en uno o varios ámbitos.

  • Un elemento que creó dentro de un ámbito solo se puede cambiar en el ámbito en el que se creó, a menos que especifique explícitamente un ámbito diferente.

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 estar oculto en el nuevo elemento, pero no se invalida ni cambia.

Ámbitos de PowerShell

PowerShell admite los ámbitos siguientes:

  • Global: ámbito que está en vigor cuando se inicia PowerShell. Las variables y funciones que están presentes cuando se inicia PowerShell se han creado en el ámbito global, como variables automáticas y variables de preferencia. Las variables, alias y funciones de los perfiles de PowerShell también se crean en el ámbito global.

  • Local: ámbito actual. El ámbito local puede ser el ámbito global o cualquier otro ámbito.

  • Script: ámbito que se crea mientras se ejecuta un archivo de script. Solo los comandos del script se ejecutan en el ámbito del script. Para los comandos de un script, el ámbito del script es el ámbito local.

Nota

Private no es un ámbito. Es una opción que cambia la visibilidad de un elemento fuera del ámbito donde se define el elemento.

Ámbitos primarios y secundarios

Puede crear un ámbito mediante la ejecución de un script o una función mediante la creación de una sesión o iniciando una nueva instancia de PowerShell. Al crear un nuevo ámbito, el resultado es un ámbito primario (el ámbito original) y un ámbito secundario (el ámbito que ha creado).

En PowerShell, todos los ámbitos son ámbitos secundarios del ámbito global, pero puede crear muchos ámbitos y muchos ámbitos recursivos.

A menos que los elementos sean privados explícitamente, los elementos del ámbito primario están disponibles para el ámbito secundario. Sin embargo, los elementos que cree y cambie en el ámbito secundario no afectan al ámbito primario, a menos que especifique explícitamente el ámbito al crear los elementos.

Herencia

Un ámbito secundario no hereda las variables, alias y funciones del ámbito primario. A menos que un elemento sea privado, el ámbito secundario puede ver los elementos en el ámbito primario. Además, puede cambiar los elementos especificando explícitamente el ámbito primario, pero los elementos no forman parte del ámbito secundario.

Sin embargo, se crea un ámbito secundario con un conjunto de elementos. Normalmente, incluye todos los alias que tienen la opción AllScope . Esta opción se describe más adelante en este artículo. Incluye todas las variables que tienen la opción AllScope , además de algunas variables automáticas.

Para buscar los elementos en un ámbito determinado, use el parámetro Scope de Get-Variable o Get-Alias.

Por ejemplo, para obtener todas las variables del ámbito local, escriba:

Get-Variable -Scope local

Para obtener todas las variables del ámbito global, escriba:

Get-Variable -Scope global

Modificadores de ámbito

Una variable, alias o nombre de función puede incluir cualquiera de los siguientes modificadores de ámbito opcionales:

  • global: : especifica que el nombre existe en el ámbito Global .

  • local: : especifica que el nombre existe en el ámbito Local . El ámbito actual siempre es el ámbito local .

  • private: : especifica que el nombre es Privado y solo es visible para el ámbito actual.

  • script: : especifica que el nombre existe en el ámbito script . El ámbito del script es el ámbito del archivo de script antecesor más cercano o Global si no hay ningún archivo de script antecesor más cercano.

  • using: : se usa para acceder a variables definidas en otro ámbito mientras se ejecutan scripts a través de cmdlets como Start-Job y Invoke-Command.

  • workflow: : especifica que el nombre existe dentro de un flujo de trabajo. Nota: Los flujos de trabajo no se admiten en PowerShell Core.

  • <variable-namespace> - Modificador creado por un proveedor de PSDrive de PowerShell. Por ejemplo:

    Espacio de nombres Descripción
    Alias: Alias definidos en el ámbito actual
    Env: Variables de entorno definidas en el ámbito actual
    Function: Funciones definidas en el ámbito actual
    Variable: Variables definidas en el ámbito actual

El ámbito predeterminado de los scripts es el ámbito de script. El ámbito predeterminado para funciones y alias es el ámbito local, incluso si se definen en un script.

Uso de modificadores de ámbito

Para especificar el ámbito de una nueva variable, alias o función, use un modificador de ámbito.

La sintaxis de un modificador de ámbito en una variable es:

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

La sintaxis de un modificador de ámbito en una función es:

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 :

$a = "one"

Para crear la misma variable en el ámbito global , use el modificador scope global: :

$global:a = "one"

Para crear la misma variable en el ámbito del script , use el script: modificador scope:

$script:a = "one"

También puede usar un modificador de ámbito con funciones. La definición de función siguiente crea una función en el ámbito global :

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

También puede usar modificadores de ámbito para hacer referencia a una variable en un ámbito diferente. El siguiente comando hace referencia a la $test variable , primero en el ámbito local y, a continuación, en el ámbito global:

$test
$global:test

El modificador de ámbito Using:

Using es un modificador de ámbito especial que identifica una variable local en un comando remoto. Sin un modificador, PowerShell espera que las variables de los comandos remotos se definan en la sesión remota.

El modificador Using scope se introduce en PowerShell 3.0.

Para obtener más información, consulte about_Remote_Variables.

La opción AllScope

Las variables y alias tienen una propiedad Option que puede tomar un valor de AllScope. Los elementos que tienen la propiedad AllScope se convierten en parte de los ámbitos secundarios que cree, aunque no se heredan retroactivamente por ámbitos primarios.

Un elemento que tiene la propiedad AllScope está visible en el ámbito secundario y forma parte de ese ámbito. Los cambios en el elemento de cualquier ámbito afectan a todos los ámbitos en los que se define la variable.

Administración del ámbito

Varios cmdlets tienen un parámetro Scope que permite obtener o establecer (crear y cambiar) elementos en un ámbito determinado. Use el siguiente comando para buscar todos los cmdlets de la sesión que tienen un parámetro Scope :

Get-Help * -Parameter scope

Para buscar las variables que están visibles en un ámbito determinado, use el Scope parámetro de Get-Variable. Las variables visibles incluyen variables globales, variables en el ámbito primario y variables del ámbito actual.

Por ejemplo, el siguiente comando obtiene las variables visibles en el ámbito local:

Get-Variable -Scope local

Para crear una variable en un ámbito determinado, use un modificador de ámbito o el parámetro Scope de Set-Variable. El comando siguiente crea una variable en el ámbito global:

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

También puede usar el parámetro Scope de los New-Aliascmdlets , Set-Aliaso Get-Alias para especificar el ámbito. El comando siguiente crea un alias en el ámbito global:

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

Para obtener las funciones de un ámbito determinado, use el Get-Item cmdlet cuando esté en el ámbito. El Get-Item cmdlet no tiene un parámetro Scope .

Nota

Para los cmdlets que usan el parámetro Scope , también puede hacer referencia a ámbitos por número. El número describe la posición relativa de un ámbito a otro. El ámbito 0 representa el ámbito actual o local. El ámbito 1 indica el ámbito primario inmediato. El ámbito 2 indica el elemento primario del ámbito primario, etc. Los ámbitos numerados son útiles si ha creado muchos ámbitos recursivos.

Uso de la notación de origen de puntos con ámbito

Los scripts y las funciones siguen todas las reglas de ámbito. 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.

Sin embargo, puede agregar un script o una función al ámbito actual mediante la notación de origen de puntos. A continuación, cuando un script se ejecuta en el ámbito actual, todas las funciones, alias y variables que crea el script están disponibles en el ámbito actual.

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.

Por ejemplo, para ejecutar el script Sample.ps1 desde el directorio C:\Scripts en el ámbito del script (el valor predeterminado para scripts), use el siguiente comando:

c:\scripts\sample.ps1

Para ejecutar el script de Sample.ps1 en el ámbito local, use el siguiente comando:

. c:\scripts.sample.ps1

Cuando se usa el operador de llamada (&) para ejecutar una función o script, no se agrega al ámbito actual. En el ejemplo siguiente se usa el operador call:

& c:\scripts.sample.ps1

Puede obtener más información sobre el operador de llamada en about_operators.

Los alias, funciones o variables que crea el script de Sample.ps1 no están disponibles en el ámbito actual.

Restringir sin ámbito

Algunos conceptos de PowerShell son similares al ámbito o interactúan con él. Estos conceptos pueden confundirse con el ámbito o el comportamiento del ámbito.

Las sesiones, los módulos y los avisos anidados son entornos independientes, pero no son ámbitos secundarios del ámbito global de la sesión.

Sesiones

Una sesión es un entorno en el que se ejecuta PowerShell. Al crear una sesión en un equipo remoto, PowerShell establece una conexión persistente al equipo remoto. La conexión persistente permite usar la sesión para varios comandos relacionados.

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ó. La sesión comienza con su propio ámbito global. Este ámbito es independiente del ámbito global de la sesión. Puede crear ámbitos secundarios en la sesión. Por ejemplo, puede ejecutar un script para crear un ámbito secundario en una sesión.

Módulos

Puede usar un módulo de PowerShell para compartir y entregar herramientas de PowerShell. Un módulo es una unidad que puede contener cmdlets, scripts, funciones, variables, alias y otros elementos útiles. A menos que se defina explícitamente, los elementos de un módulo no son accesibles fuera del módulo. 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 podrían invalidar los cmdlets, scripts, funciones y otros elementos de la sesión.

La privacidad de un módulo se comporta como un ámbito, pero agregar un módulo a una sesión no cambia el ámbito. Además, el módulo no tiene su propio ámbito, aunque los scripts del módulo, como todos los scripts de PowerShell, tienen su propio ámbito.

De forma predeterminada, los módulos se cargan en el nivel superior del estado de sesión actual no en el ámbito actual. Podría ser un estado de sesión del módulo o el estado de sesión global. Si se encuentra en el ámbito global, los módulos se cargan en el estado de sesión global. Las exportaciones se colocan en las tablas globales. Si carga module2 desde el módulo1, module2 se carga en el estado de sesión del módulo1, no en el estado de sesión global. Las exportaciones de module2 se colocan en la parte superior del estado de sesión del módulo1. Si usa Import-Module -Scope local, las exportaciones se colocan en el objeto de ámbito actual en lugar de en el nivel superior. Si está en un módulo y usa Import-Module -Scope global (o Import-Module -Global) para cargar otro módulo, ese módulo y sus exportaciones se cargan en el estado de sesión global en lugar del estado de sesión local del módulo. Esta característica se diseñó para escribir módulos que manipulan módulos. El módulo WindowsCompatibility hace esto para importar módulos de proxy en el ámbito global.

Mensajes anidados

Del mismo modo, las solicitudes anidadas no tienen su propio ámbito. Cuando se escribe un mensaje anidado, el aviso anidado es un subconjunto del entorno. Sin embargo, permanece dentro del ámbito local.

Los scripts tienen su propio ámbito. Si está depurando un script y llega a un punto de interrupción en el script, escriba el ámbito del script.

Opción privada

Los alias y las variables tienen una propiedad Option que puede tomar un valor de Private. Los elementos que tienen la opción Private se pueden ver y cambiar en el ámbito en el que se crean, pero no se pueden ver ni cambiar fuera de ese ámbito.

Por ejemplo, si crea una variable que tiene una opción privada en el ámbito global y, a continuación, ejecuta un script, Get-Variable los comandos del script no muestran la variable privada. El uso del modificador de ámbito global en esta instancia no muestra la variable privada.

Puede usar el parámetro Option de los New-Variablecmdlets , Set-Variable, New-Aliasy Set-Alias para establecer el valor de la propiedad Option en Private.

Visibilidad

La propiedad Visibility de una variable o alias determina si puede ver el elemento fuera del contenedor, en el que se creó. Un contenedor podría ser un módulo, un script o un complemento. La visibilidad está diseñada para contenedores de la misma manera que el valor Privado de la propiedad Option está diseñado para ámbitos.

La propiedad Visibility toma los valores Public y Private . Los elementos que tienen visibilidad privada solo se pueden ver y cambiar en el contenedor en el que se crearon. Si el contenedor se agrega o importa, los elementos que tienen visibilidad privada no se pueden ver ni cambiar.

Dado que la visibilidad está diseñada para contenedores, funciona de forma diferente en un ámbito.

  • Si crea un elemento que tiene visibilidad privada en el ámbito global, no podrá ver ni cambiar el elemento en ningún ámbito.
  • Si intenta ver o cambiar el valor de una variable que tiene visibilidad privada, PowerShell devuelve un mensaje de error.

Puede usar los New-Variable cmdlets y Set-Variable para crear una variable que tenga visibilidad privada.

Ejemplos

Ejemplo 1: Cambiar un valor de variable solo en un script

El siguiente comando cambia el valor de la $ConfirmPreference variable en un script. El cambio no afecta al ámbito global.

En primer lugar, para mostrar el valor de la $ConfirmPreference variable en el ámbito local, use el siguiente comando:

PS>  $ConfirmPreference
High

Create un script de Scope.ps1 que contiene los siguientes comandos:

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

Ejecute el script. El script cambia el valor de la $ConfirmPreference variable y, a continuación, informa de su valor en el ámbito del script. La salida debe ser similar a la siguiente:

The value of $ConfirmPreference is Low.

A continuación, pruebe el valor actual de la $ConfirmPreference variable en el ámbito actual.

PS>  $ConfirmPreference
High

En este ejemplo se muestra que los cambios realizados en el valor de una variable en el ámbito del script no afectan al valor de la variable en el ámbito primario.

Ejemplo 2: Ver un valor de variable en distintos ámbitos

Puede usar modificadores de ámbito para ver el valor de una variable en el ámbito local y en un ámbito primario.

En primer lugar, defina una $test variable en el ámbito global.

$test = "Global"

A continuación, cree un script de Sample.ps1 que defina la $test variable. En el script, use un modificador de ámbito para hacer referencia a las versiones globales o locales de la $test variable.

En 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:

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.

PS>  $test
Global

Ejemplo 3: Cambiar el valor de una variable en un ámbito primario

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.

En primer lugar, defina una $test variable en el ámbito global.

$test = "Global"

A continuación, cree un script de Sample.ps1 que defina la $test variable. En el script, use un modificador de ámbito para hacer referencia a las versiones globales o locales de la $test variable.

En 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 .

PS>  $test
Local

Ejemplo 4: Creación de una variable privada

Una variable privada es una variable que tiene una propiedad Option que tiene un valor de Private. El ámbito secundario hereda las variables privadas, pero solo se pueden ver o cambiar en el ámbito en el que se crearon.

El comando siguiente crea una variable privada denominada $ptest en el ámbito local.

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

Puede mostrar y cambiar el valor de $ptest en el ámbito local.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

A continuación, cree un script de Sample.ps1 que contenga los siguientes comandos. El comando intenta mostrar y cambiar el valor de $ptest.

En 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 value of $Ptest is ."
"The value of $Ptest is ."

Ejemplo 5: Usar una variable local en un comando remoto

Para las variables de un comando remoto creado en la sesión local, use el Using modificador de ámbito. PowerShell supone que las variables de los comandos remotos se crearon en la sesión remota.

La sintaxis es:

$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:

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

El ámbito Using se introdujo en PowerShell 3.0. En PowerShell 2.0, para indicar que se creó una variable en la sesión local, use el siguiente formato de comando.

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

Consulte también

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks