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