about_Scopes

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

TEMA

about_Scopes

DESCRIPCIÓN BREVE

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

DESCRIPCIÓN LARGA

Windows PowerShell protege el acceso a variables, alias, funciones y unidades de Windows PowerShell (PSDrives) al limitar dónde se pueden leer y cambiar. Mediante unas sencillas reglas de ámbito, Windows PowerShell ayuda a asegurarse de no cambiar accidentalmente un elemento que no se deba cambiar.

Estas son las reglas básicas de ámbito:

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

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

Si se crea un elemento en un ámbito y el elemento tiene el mismo nombre que un elemento de un ámbito diferente, el elemento original podría quedar oculto por el elemento nuevo. No obstante, no se reemplaza ni se cambia.

ÁMBITOS DE WINDOWS POWERSHELL

Los ámbitos de Windows PowerShell tienen nombres y números. Los ámbitos con nombre especifican un ámbito absoluto. Los números son relativos y reflejan la relación entre los ámbitos.

  • Global:
    El ámbito que está en vigor cuando se inicia Windows PowerShell. Las variables y las funciones que están presentes cuando se inicia Windows PowerShell se crearon en el ámbito global. Esto incluye las variables automáticas y las variables de preferencia. Esto también incluye las variables, los alias y las funciones que se encuentran en los perfiles de Windows PowerShell.
  • Local:
    El ámbito actual. El ámbito local puede ser el ámbito global o cualquier otro ámbito.
  • Script:
    El á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.
  • Privado:
    Los elementos de un ámbito privado no se pueden ver fuera del ámbito actual. Puede usar un ámbito privado para crear una versión privada de un elemento con el mismo nombre en otro ámbito.
  • Ámbitos con número:
    Puede hacer referencia a los ámbitos por nombre o por un número que describe la posición relativa de un ámbito con respecto a otro. El ámbito 0 representa el ámbito actual o local. El ámbito 1 indica que el ámbito primario inmediato. El ámbito 2 indica el elemento primario del ámbito primario, y así sucesivamente. Los ámbitos con número son útiles si se crearon muchos ámbitos recursivos.

ÁMBITOS PRIMARIOS Y SECUNDARIOS

Puede crear un ámbito nuevo ejecutando un script o una función, creando una sesión o iniciando una nueva instancia de Windows PowerShell. Cuando se crea un ámbito nuevo, el resultado es un ámbito primario (el ámbito original) y un ámbito secundario (el ámbito que se creó).

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

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

HERENCIA

Un ámbito secundario no hereda las variables, los alias y las funciones del ámbito primario. A menos que un elemento sea privado, el ámbito secundario puede ver los elementos del á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, un ámbito secundario se crea con un conjunto de elementos. Por lo general, incluye todos los alias que tengan la opción AllScope. Esta opción se describe más adelante en este tema. Incluye todas las variables que tengan la opción AllScope, además de algunas variables que pueden usarse para personalizar el ámbito, como MaximumFunctionCount.

Para buscar los elementos de 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

Para especificar el ámbito de una variable, alias o función nuevos, use un modificador de ámbito. Los valores válidos de un modificador son Global, Local, Private y Script.

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 ámbito predeterminado de los scripts es el ámbito del script. El ámbito predeterminado de las funciones y los alias es el ámbito local, incluso si están definidos en un script.

El comando siguiente, 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 de ámbito Global:

       $global:a = "one"

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

       $script:a = "one"

También puede usar un modificador de ámbito en las 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 los modificadores de ámbito para hacer referencia a una variable de un ámbito diferente. El comando siguiente hace referencia a la variable $test, primero en el ámbito local y después en el ámbito global:

      $test

      $global:test

EL MODIFICADOR DE ÁMBITO USING

Using es un modificador de ámbito especial que identifica una variable local de un comando remoto. De forma predeterminada, se supone que las variables de comandos remotos están definidas en la sesión remota.

El modificador de ámbito Using se introdujo en Windows PowerShell 3.0.

Para más información, consulte about_Remote_Variables.

LA OPCIÓN ALLSCOPE

Las variables y los alias tienen una propiedad Option que puede tomar un valor AllScope. Los elementos que tienen la propiedad AllScope pasan a formar parte de los ámbitos secundarios que se creen, aunque los ámbitos primarios no los heredan con carácter retroactivo.

Los elementos que tienen la propiedad AllScope están visibles en el ámbito secundario y forman parte de ese ámbito. Los cambios realizados en el elemento en cualquier ámbito afectan a todos los ámbitos en los que se define la variable.

ADMINISTRAR EL ÁMBITO

Varios cmdlets tienen un parámetro Scope que permite obtener o establecer (crear y cambiar) los elementos de un ámbito determinado. Use el comando siguiente 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 parámetro Scope de Get-Variable. Los parámetros visibles incluyen parámetros globales, parámetros del ámbito primario y parámetros del ámbito actual.

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

        get-variable -scope local

Para crear una variable en un ámbito concreto, 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 del los cmdlets New-Alias, Set-Alias o 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 concreto, use el cmdlet Get-Item cuando se encuentre en el ámbito. El cmdlet Get-Item no tiene un parámetro de ámbito.

USAR LA NOTACIÓN DE SCRIPTS PREFIJADOS POR PUNTOS CON EL ÁMBITO

Los scripts y las funciones siguen todas las reglas del ámbito. Se crean en un ámbito concreto y afectan solo a ese ámbito, a menos que use un parámetro de cmdlet o un modificador de ámbito para cambiar el ámbito.

Sin embargo, puede agregar un script o una función al ámbito actual mediante la notación de scripts prefijados por 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 los scripts), use el comando siguiente:

        c:\scripts\sample.ps1

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

        . 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. En el ejemplo siguiente se usa el operador de llamada:

        & c:\scripts.sample.ps1

Ninguno de los alias, funciones y variables que crea el script Sample.ps1 están disponibles en el ámbito actual.

RESTRINGIR SIN ÁMBITO

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

Las sesiones, los módulos y los símbolos del sistema 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 Windows PowerShell. Cuando se crea una sesión en un equipo remoto, Windows PowerShell establece una conexión persistente con el equipo remoto. La conexión persistente permite usar la sesión de varios comandos relacionados.

    Dado que una sesión es un entorno independiente, 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 se inicia 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 Windows PowerShell para compartir y entregar herramientas de Windows 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 invaliden los cmdlets, scripts, funciones y otros elementos de la sesión.

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

  • Símbolos del sistema anidados:
    De forma similar, los símbolos del sistema anidados no tienen su propio ámbito. Cuando se especifica un símbolo del sistema anidado, dicho símbolo del sistema es un subconjunto del entorno. Sin embargo, se permanece en el ámbito local.

    Los scripts tienen su propio ámbito. Si está depurando un script y se alcanza un punto de interrupción en el script, se entra en el ámbito del script.

  • Opción Private:
    Los alias y las variables tienen una propiedad Option que puede tomar un valor Private. Los elementos que tienen la opción Private pueden verse y modificarse en el ámbito en el que se crearon, pero no puede verse ni modificarse fuera de ese ámbito.

    Por ejemplo, si crea una variable que tiene una opción privada en el ámbito global y después ejecuta un script, los comandos Get-Variable del script no muestran la variable privada. Esto ocurre aunque use el modificador de ámbito global.

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

  • Visibilidad:
    La propiedad Visibility de una variable o alias determina si se puede ver el elemento fuera del contenedor, como un módulo, en el que se creó. Está diseñada para los contenedores del mismo modo que el valor Private de la propiedad Option está diseñado para los ámbitos.

    La propiedad Visibility toma los valores Public y Private. Los elementos que tienen visibilidad privada pueden verse y modificarse únicamente en el contenedor en el que se crearon. Si el contenedor se agrega o se importa, los elementos con visibilidad privada no puede verse ni modificarse.

    Dado que la propiedad Visibility está diseñada para los contenedores, funciona de forma diferente en un ámbito. Si crea un elemento que tiene visibilidad privada en el ámbito global, no puede ver ni modificar el elemento en ningún ámbito. Si trata de ver o modificar el valor de una variable que tiene visibilidad privada, Windows PowerShell devuelve un mensaje de error.

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

EJEMPLOS

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

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

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

          C:\PS> $ConfirmPreference
          High

Cree un script Scope.ps1 que contenga los comandos siguientes:

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

Ejecute el script. El script cambia el valor de la variable $ConfirmPreference y, a continuación, notifica 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 variable $ConfirmPreference en el ámbito actual.

          C:\PS> $ConfirmPreference
          High

Este ejemplo muestra que los cambios en el valor de una variable en el ámbito del script no afectan al valor de esa variable en el ámbito primario.

Ejemplo 2: Ver el valor de una 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 variable $test en el ámbito global.

        $test = "Global"

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

          # In Sample.ps1

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

Cuando ejecute Sample.ps1, la salida debe ser similar a la siguiente:

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

Cuando se completa el script, solo está definido en la sesión el valor global de $test.

          C:\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 modificar el valor de una variable en un ámbito primario.

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

        $test = "Global"

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

          # In Sample.ps1

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

Cuando se completa el script, cambia el valor global de $test.

          C:\PS> $test
          Local

Ejemplo 4: Crear una variable privada

Una variable privada es una variable que tiene una propiedad Option con valor Private. Aunque el ámbito secundario hereda las variables privadas, estas solo pueden verse o modificarse 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 modificar el valor de $ptest en el ámbito local.

          C:\PS> $ptest
          1
          C:\PS> $ptest = 2
          C:\PS> $ptest
          2

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

          # In Sample.ps1

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

Dado que la variable $ptest 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 indicar que se creó una variable en un comando remoto en la sesión local, use el modificador de ámbito Using. De forma predeterminada, Windows PowerShell supone que las variables de los comandos remotos se crearon en la sesión remota.

La sintaxis es la siguiente:

           $Using:<VariableName>

Por ejemplo, los comandos siguientes crean una variable $Cred en la sesión local y, a continuación, usan la variable $Cred en un comando remoto:

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

El ámbito Using se introdujo en Windows PowerShell 3.0.

En Windows PowerShell 2.0, para indicar que una variable se creó 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

VEA TAMBIÉN

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks