TEMA
    about_Scopes

DESCRIPCIÓN BREVE
    Explica el concepto de ámbito en Windows PowerShell y muestra cómo 
    establecer y cambiar el ámbito de los elementos.

    
DESCRIPCIÓN DETALLADA
    Windows PowerShell protege el acceso a las variables, los alias, 
    las funciones y las unidades de Windows PowerShell (PSDrives) limitando 
    las ubicaciones donde se pueden leer y cambiar. Mediante unas pocas 
    reglas sencillas de ámbito, Windows PowerShell ayuda a garantizar que 
    no se pueda cambiar accidentalmente un elemento que no debe modificarse.


    A continuación figuran las reglas básicas de ámbito:

        - Un elemento que se incluye en un ámbito está visible en el 
          ámbito donde se creó y en cualquier ámbito secundario, 
          a menos que se establezca explícitamente dicho elemento como 
          privado. Las variables, los alias, las funciones y las unidades 
          de Windows PowerShell pueden colocarse en uno o varios ámbitos. 

        - Un elemento que se crea en un ámbito puede cambiarse 
          únicamente en el ámbito donde se creó, a menos que se 
          especifique explícitamente un ámbito diferente.


    Si se crea un elemento en un ámbito y dicho elemento comparte su 
    nombre con un elemento en otro ámbito, puede que el elemento 
    original quede oculto bajo el nuevo elemento. Sin embargo, no se 
    invalida ni se modifica.


  Á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 que existe entre los ámbitos.


    Ámbito global: 
        Es el ámbito que está en vigor cuando se inicia Windows 
        PowerShell. Las variables y funciones que están presentes 
        cuando se inicia Windows PowerShell se han creado en el 
        ámbito global. Esto incluye las variables automáticas y las 
        variables de preferencia. También están incluidos los alias, las 
        variables y las funciones que están en los perfiles de Windows 
        PowerShell. 

    Ámbito local: 
        Es el ámbito actual. El ámbito local puede ser el ámbito global o 
        cualquier otro ámbito. 

    Ámbito de script: 
        Es el ámbito que se crea durante la ejecución de un archivo 
        de script. En el ámbito de script se ejecutan únicamente los 
        comandos del script. Para los comandos de un script, el ámbito 
        de script es el ámbito local.

    Ámbito privado:

        Los elementos que se encuentran en el ámbito privado no se 
        pueden ver fuera del ámbito actual. Se puede utilizar un ámbito privado 
        para crear una versión privada de un elemento que lleve el mismo nombre 
        en otro ámbito.

    Ámbitos numerados:
        Para hacer referencia a los ámbitos, se puede usar un nombre 
        o 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 
        el ámbito principal inmediato. El ámbito 2 indica el ámbito 
        principal del ámbito principal, etc. Los ámbitos numerados resultan 
        útiles si se han creado muchos ámbitos recursivos.


 Ámbitos principales y secundarios
 
    Se 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 principal 
    (ámbito original) y un ámbito secundario (ámbito que se ha creado).


    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 se establezcan explícitamente los elementos como privados, 
    los elementos del ámbito principal están disponibles en el ámbito 
    secundario. Sin embargo, los elementos que se crean y se modifican en 
    el ámbito secundario no afectan al ámbito principal, a menos que se 
    especifique explícitamente el ámbito al crear los elementos.

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


    Sin embargo, un ámbito secundario se crea con un conjunto de 
    elementos. Normalmente, incluye todos los alias que tienen la opción 
    AllScope. Esta opción se aborda más adelante en este tema. Incluye 
    todas las variables que tienen la opción AllScope, además de algunas 
    variables que se pueden usar para personalizar el ámbito, como 
    MaximumFunctionCount.


    Para obtener los elementos de un ámbito concreto, utilice 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 nueva variable, un nuevo alias 
    o una nueva función, use un modificador de ámbito. Los valores 
    válidos de un modificador son Global y Script.


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

        $[<modificador de ámbito>]:<nombre> = <valor>


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

        función [<modificador de ámbito>]:<nombre> {<cuerpo de la función>}


    El ámbito predeterminado de los scripts es el ámbito de script. 
    El ámbito predeterminado de las funciones y los alias es el 
    ámbito local, incluso si se definen en un script.
 
 
    El comando siguiente, que no usa un modificador de ámbito, crea 
    una variable en el ámbito actual o local: 

       $a = "uno" 

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

       $global:a = "uno" 


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

       $script:a = "uno" 


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

       function global:Hola
       {
	    write-host "Hola a todos"
       }


    Los modificadores de ámbito también se pueden usar para hacer 
    referencia a una variable de otro ámbito. El comando siguiente hace 
    referencia a la variable $test, primero en el ámbito local y después en el 
    ámbito global:

      $test
	
      $global:test


 Opción AllScope
 
    Las variables y los alias tienen una propiedad Option, cuyo valor 
    puede ser AllScope. Los elementos que tienen la propiedad AllScope 
    pasan a formar parte de todos los ámbitos secundarios que se creen, 
    si bien los ámbitos principales no los heredan de forma retroactiva. 


    Un elemento que tiene la propiedad AllScope está visible en el ámbito 
    secundario y forma parte de dicho ámbito. Los cambios que se realicen 
    en el elemento desde cualquiera de los ámbitos afectarán a todos los 
    ámbitos en los que esté definida 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 concreto. 
    Use el comando siguiente para obtener todos los cmdlets de su 
    sesión que tengan un parámetro Scope: 

         get-help * -parameter scope


    Para obtener las variables que estén visibles en un ámbito 
    determinado, utilice el parámetro Scope de Get-Variable. Los 
    parámetros visibles incluyen parámetros globales, parámetros del 
    ámbito principal 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 determinado, utilice 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 "Uno"


    También puede utilizar el parámetro Scope del cmdlet 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 determinado, utilice el 
    cmdlet Get-Item cuando se encuentre en dicho ámbito. El cmdlet 
    Get-Item no tiene el parámetro Scope.


 Usar la notación de script prefijado por punto con el ámbito
 
    Los scripts y funciones siguen todas las reglas de ámbito. Se 
    crean en un ámbito determinado y afectan únicamente a ese ámbito, 
    a menos que se use un parámetro de cmdlet o un modificador de 
    ámbito para cambiar dicho ámbito.


    Sin embargo, se puede agregar un script o una función al ámbito actual 
    mediante la notación de script prefijado por punto. De ese modo, 
    si se ejecuta un script en el ámbito actual, todos los alias, funciones 
    y variables que cree el script estarán disponibles en el ámbito actual. 
 

    Para agregar una función al ámbito actual, inserte un punto (.) y 
    un espacio delante de la ruta de acceso y el nombre de la función 
    en la llamada de función.


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

        c:\scripts\ejemplo.ps1


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

        . c:\scripts.ejemplo.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 utiliza el operador de llamada:

        & c:\scripts.ejemplo.ps1


    Cualquier alias, función o variable que cree el script 
    Ejemplo.ps1 no estará disponible en el ámbito actual.


 Restringir sin ámbito
 
    Algunos conceptos de Windows PowerShell son similares al ámbito o 
    interactúan con él. Estos conceptos podrían confundirse con el ámbito 
    o con su comportamiento.


    Las sesiones, los módulos y los símbolos del sistema anidados son 
    entornos autónomos, pero no son ámbitos secundarios del ámbito 
    global en 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 para varios comandos relacionados.
 

        Dado que es un entorno autónomo, una sesión tiene su propio 
        ámbito pero 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.
        Se pueden crear ámbitos secundarios en la sesión. Por 
        ejemplo, se puede ejecutar un script para crear un ámbito 
        secundario en una sesión.

    Módulos:
        Se puede usar un módulo de Windows PowerShell para compartir y 
        proporcionar 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 especifique 
        explícitamente, los elementos de un módulo no son accesibles desde 
        fuera del módulo. Por consiguiente, se puede agregar el módulo a una 
        sesión y usar los elementos públicos sin tener que preocuparse de que 
        los otros elementos invaliden los cmdlets, scripts, funciones y demás 
        elementos de la sesión.


        La privacidad de un módulo se comporta como un ámbito, pero 
        al agregar un módulo a una sesión, no se modifica 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, sí 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 escribe un símbolo del sistema 
        anidado, este es un subconjunto del entorno. Sin embargo, se 
        permanece en el ámbito local. 


        Los scripts tienen su propio ámbito. Cuando se depura un 
        script y se alcanza un punto de interrupción en el script, se 
        entra en el ámbito de script.


    Opción de privacidad:
        Los alias y las variables tienen una propiedad Option, cuyo 
        valor puede ser Private. Los elementos que tienen la opción 
        Private se pueden ver y modificar en el ámbito donde se han 
        creado, pero no se pueden ver ni modificar fuera de ese ámbito. 


        Por ejemplo, si se crea una variable que tiene la opción de 
        privacidad en el ámbito global y, a continuación, se ejecuta 
        un script, los comandos Get-Variable del script no muestran 
        la variable privada. Esto es así incluso si se usa el 
        modificador de ámbito global. 
   

        Se 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 de un alias 
        determina si se puede ver el elemento fuera del contenedor, 
        como un módulo, en el que se creó. La propiedad Visibility se ha 
        diseñado para los contenedores del mismo modo que se ha diseñado el 
        valor Private de la propiedad Option para los ámbitos.


        Los valores de la propiedad Visibility son Public y Private. 
        Los 
elementos con visibilidad privada se pueden ver y modificar 
        únicamente en el contenedor donde se crearon. Si se agrega o se 
        importa el contenedor, los elementos con visibilidad privada no se 
        pueden ver ni modificar.


        Dado que la propiedad Visibility se ha diseñado para los 
        contenedores, funciona de manera diferente en los ámbitos. 
        Si se crea un elemento con visibilidad privada en el ámbito 
        global, no se podrá ver ni cambiar dicho elemento en ningún 
        ámbito. Si se intenta ver o cambiar el valor de una variable con 
        visibilidad privada, Windows PowerShell devolverá un mensaje de error.


        Se pueden usar los cmdlets New-Variable y Set-Variable para 
        crear una variable con visibilidad privada.

   
EJEMPLOS

  Ejemplo 1: cambiar el valor de una variable únicamente 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"
          "El valor de `$ConfirmPreference es $ConfirmPreference." 


      Ejecute el script. El script cambia el valor de la variable 
      $ConfirmPreference y, a continuación, notifica su valor en el ámbito 
      de script. El resultado debería ser similar al siguiente:

          El valor de $ConfirmPreference es Low.

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

          C:\PS> $ConfirmPreference
          High

      
      En este ejemplo, se muestra que los cambios realizados en el 
      valor de una variable en el ámbito de script no afectan al 
      valor de dicha variable en el ámbito principal.


  Ejemplo 2: ver el valor de una variable en diferentes ámbitos 

      Se pueden usar los modificadores de ámbito para ver el valor de una 
      variable en el ámbito local y en un ámbito principal. 


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

	  $test = "Global"

      A continuación, cree un script Ejemplo.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.


          # En Ejemplo.ps1

          $test = "Local"
          "El valor local de `$test es $test." 
          "El valor global de `$test es $global:test." 
    
      Cuando ejecute Ejemplo.ps1, el resultado deberá ser similar al siguiente:
         
          El valor local de $test es Local.
          El valor global de $test es Global.


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

          C:\PS> $test
          Global


  Ejemplo 3: cambiar el valor de una variable en un ámbito principal

      A menos que se proteja un elemento mediante la opción Private u otro 
      método, se puede ver y cambiar el valor de una variable en un ámbito 
      principal.


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

	  $test = "Global"


      A continuación, cree un script Ejemplo.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.

          # En Ejemplo.ps1

          $global:test = "Local"
          "El valor global de `$test es $global:test."

        
      Cuando se complete el script, el valor global de $test habrá cambiado.

          C:\PS> $test
          Local
          

  Ejemplo 4: crear una variable privada

      Una variable privada es una variable con una propiedad Option 
      cuyo valor es Private. Las variables privadas las hereda el ámbito 
      secundario, pero se pueden ver o cambiar únicamente en el ámbito donde se 
      crearon.


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

	  new-variable -name ptest -value 1 -option private


      El valor de $ptest se puede mostrar y cambiar en el ámbito local.

	  C:\PS> $ptest
          1
          C:\PS> $ptest = 2
          C:\PS> $ptest
	  2
         
      
      A continuación, cree un script Ejemplo.ps1 que contenga los comandos siguientes.
      El comando intenta mostrar y cambiar el valor de $ptest.  

          # En Ejemplo.ps1

          "El valor de `$Ptest es $Ptest."
      	  "El valor de `$Ptest es $global:Ptest."

    
      Dado que la variable $ptest no puede verse en el ámbito de 
      script, el resultado está en blanco.
    
          "El valor de $Ptest es ."
      	  "El valor de $Ptest es ."
        
   
VEA TAMBIÉN
    about_Variables
    about_Environment_Variables
    about_Functions
    about_Script_Blocks




Tabla de contenido