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