es.phhsnews.com


es.phhsnews.com / Cómo afectan los ámbitos a las secuencias de comandos de PowerShell

Cómo afectan los ámbitos a las secuencias de comandos de PowerShell


En las secuencias de comandos de proceso por lotes, los cambios en las variables de entorno tienen un impacto global en la sesión actual de forma predeterminada. Para PowerShell, todo lo contrario es cierto porque los ámbitos se utilizan para aislar las modificaciones de un script. Aquí, exploraremos cómo afectan los ámbitos a las secuencias de comandos de PowerShell y cómo trabajar dentro y fuera de ellas.

¿Qué es un Ámbito?

En PowerShell, un "alcance" hace referencia al entorno actual en el que una secuencia de comandos o comandos está operando. Los ámbitos se usan para proteger ciertos objetos dentro del entorno de modificaciones involuntarias por scripts o funciones. En particular, los siguientes elementos están protegidos contra la modificación por comandos ejecutados desde otro ámbito, a menos que los parámetros de esos comandos especifiquen lo contrario:

  • Variables
  • Alias ​​
  • Funciones
  • Unidades PowerShell (PSDrives)

Nuevos ámbitos se crean cada vez que ejecuta un script o función, o cuando crea una nueva sesión o instancia de PowerShell. Los ámbitos creados mediante la ejecución de scripts y funciones tienen una relación "principal / secundario" con el ámbito desde el que se crearon. Hay algunos ámbitos que tienen un significado especial, y se puede acceder por su nombre:

  • El alcance Global es el ámbito que se crea cuando se inicia PowerShell. Incluye las variables, alias, funciones y PSDrives que están incorporados en PowerShell, así como también los que crea su perfil de PowerShell.
  • El alcance Local se refiere a cualquiera que sea el alcance actual. Cuando inicie PowerShell, se referirá al ámbito Global, dentro de un script será el alcance del Script, etc.
  • El ámbito Script se crea cuando se ejecuta un script. Los únicos comandos que operan dentro de este alcance son los que están en el script.
  • Los ámbitos privados se pueden definir dentro del alcance actual, para evitar que los comandos en otros ámbitos puedan leer o modificar elementos que de otro modo podrían tener acceso a.

Los ámbitos también se pueden consultar por número en ciertos comandos, donde el alcance actual se conoce como cero y sus antepasados ​​se referencian por números enteros crecientes. Por ejemplo, dentro de un script ejecutado desde el alcance Global, el alcance del Script sería 0 y el alcance Global sería 1. Un ámbito que fue anidado en el ámbito del Script, como una función, se referiría al alcance Global como 2 Sin embargo, los números negativos no funcionarán para hacer referencia a ámbitos secundarios. La razón para esto será evidente en breve.

Cómo afectan los ámbitos a los comandos

Como se mencionó anteriormente, los comandos ejecutados dentro de un alcance no afectarán las cosas en otro ámbito a menos que se indique específicamente para hacerlo Por ejemplo, si $ MyVar existe en el alcance Global y un script ejecuta un comando para configurar $ MyVar a un valor diferente, la versión Global de $ MyVar permanecerá inalterada mientras se coloca una copia de $ MyVar en el alcance del Script con el nuevo valor. Si no existe $ MyVar, un script lo creará dentro del alcance del Script de manera predeterminada, no en el alcance Global. Esto es importante de recordar a medida que aprende sobre la relación padre / hijo real entre ámbitos.

La relación padre / hijo de ámbitos en PowerShell es unidireccional. Los comandos pueden ver y, opcionalmente, modificar el alcance actual, su elemento principal y cualquier ámbito que se encuentre por encima. Sin embargo, no pueden ver ni modificar cosas en ningún elemento secundario del alcance actual. Esto se debe principalmente a que, una vez que se ha movido a un ámbito principal, el alcance hijo ya se ha destruido porque ha cumplido su propósito. Por ejemplo, ¿por qué debería ver o modificar una variable en el ámbito del Script, desde el alcance Global, una vez que el script ha finalizado? Hay muchos casos en los que necesita que los cambios de un script o una función persistan más allá de su finalización, pero no tantos en los que necesite realizar cambios en los objetos dentro del alcance del script o de la función antes o después de ejecutarlo. (Por lo general, tales cosas se manejarán como parte de la secuencia de comandos o la función en sí de todos modos.)

Por supuesto, ¿qué son las reglas sin excepciones? Una excepción a lo anterior son los ámbitos privados. Los objetos en los ámbitos privados solo son accesibles para los comandos que se ejecutan en el ámbito desde el que se crearon. Otra excepción importante son los artículos que tienen la propiedad AllScope. Estas son variables especiales y alias para los cuales un cambio en cualquier ámbito afectará a todos los ámbitos. Los siguientes comandos le mostrarán qué variables y alias tienen la propiedad AllScope:

Get-Variable | Where-Object {$ _. Opciones -match 'AllScope'} Get-Alias ​​| Where-Object {$ _. Opciones -match 'AllScope')

Scopes en acción

Para nuestro primer vistazo a los ámbitos en acción, vamos a comenzar en una sesión de PowerShell donde se ha establecido la variable $ MyVar a una cadena, '¡Soy una variable global!', desde la línea de comando. Luego, la siguiente secuencia de comandos se ejecutará desde un archivo llamado Scope-Demo.ps1:

Función FunctionScope {'Cambiar $ MyVar con una función'. $ MyVar = '¡Fui configurado por una función!' "MyVar dice $ MyVar"} "Comprobando el valor actual de $ MyVar". "MyVar dice $ MyVar" "Cambiando $ MyVar por script". $ MyVar = '¡Me puse un guión!' "MyVar dice $ MyVar" "FunctionScope" Comprobando el valor final de MyVar antes de la salida del script. ' "MyVar dice $ MyVar" "

Si los scripts de PowerShell funcionaban igual que los scripts por lotes, esperaríamos que el valor de $ MyVar (o% MyVar% en sintaxis por lotes) cambiara de '¡Soy una variable global!', a '¡Me puse un guión!', y finalmente a '¡Me puse una función!' donde permanecería hasta que se cambie explícitamente de nuevo o hasta que la sesión finalice. Sin embargo, vea lo que sucede aquí a medida que avanzamos en cada uno de los ámbitos, particularmente después de que la función FunctionScope haya completado su trabajo y verifiquemos nuevamente la variable desde la secuencia de comandos. y, más tarde, el alcance Global.

Como puede ver, la variable pareció cambiar a medida que avanzábamos en el script porque, hasta que se completó la función FunctionScope, estábamos verificando la variable dentro del mismo ámbito que era el último Sin embargo, después de que se hizo FunctionScope, volvimos al alcance del Script donde $ MyVar no había sido tocado por la función. Luego, cuando el script finalizó, volvimos al alcance Global donde no había sido modificado en absoluto.

Alcance fuera del ámbito local

Por lo tanto, esto está muy bien para ayudarlo a evitar la aplicación accidental de cambios en el entorno más allá de sus secuencias de comandos y funciones, pero ¿qué sucede si realmente desea hacer tal modificación? aciones? Existe una sintaxis especial y bastante simple para crear y modificar objetos más allá del alcance Local. Simplemente coloque el nombre del ámbito al comienzo del nombre de la variable y coloque dos puntos entre el alcance y los nombres de las variables. De esta manera:

$ global: MyVar $ script: MyVar $ local: MyVar

Puede usar estos modificadores tanto al visualizar como al establecer variables. Veamos qué sucede con este script de demostración:

Función FunctionScope {"Cambiar $ MyVar en el alcance de la función local ... '$ local: MyVar =" Esto es MyVar en el alcance local de la función. "' Cambiar $ MyVar en el alcance del script ... '$ script: MyVar =' MyVar solía establecerse mediante un script. Ahora se establece mediante una función. "Cambiar $ MyVar en el ámbito global ... '$ global: MyVar =' MyVar se configuró en el ámbito global. Ahora configurado por una función. "Verificando $ MyVar en cada ámbito ... '" Local: $ local: MyVar " Script: $ script: MyVar " Global: $ global: MyVar "} "Obteniendo el valor actual de $ MyVar.' "MyVar dice $ MyVar" "Cambiando $ MyVar por script". $ MyVar = '¡Me puse un guión!' "MyVar dice $ MyVar" FunctionScope 'Comprobando $ MyVar desde el alcance del script antes de salir.' "MyVar dice $ MyVar" "

Como antes, comenzaremos por establecer la variable en el alcance global y terminaremos con la comprobación del resultado final del alcance global.

Aquí puede ver que FunctionScope pudo cambiar la variable en el alcance del Script, y los cambios persisten después de que se completó. Además, el cambio a la variable en el alcance Global persistió incluso después de que el script había salido. Esto puede ser particularmente útil si tiene que cambiar variables de manera repetida dentro de un script o dentro del alcance Global, utilizando el mismo código: usted solo define una función o secuencia de comandos que se escribe para modificar la variable dónde y cómo la necesita, y la llama cuando esos cambios son necesarios.

Como se mencionó anteriormente, Los números de alcance también se pueden usar en ciertos comandos para modificar la variable en diferentes niveles en relación con el alcance Local. Aquí está el mismo script utilizado en el segundo ejemplo anterior, pero con la función modificada para usar los comandos Get-Variable y Set-Variable con alcance numérico en lugar de referenciar directamente la variable con ámbitos determinados:

Function FunctionScope {"Cambiando $ MyVar en el alcance 0, relativo a FunctionScope ... 'Set-Variable MyVar" Esto es MyVar en el alcance de la función 0. "-Área 0' Cambiando $ MyVar en el alcance 1, relativo a FunctionScope ... 'Variable-Set MyVar 'MyVar fue cambiado en el alcance 1, desde una función'. -Scope 1 'Cambiando $ MyVar en el alcance 2, relativo a Functioncope ...' SetVariable MyVar 'MyVar fue cambiado en el alcance 2, desde una función.' -Scope 2 "Comprobando $ MyVar en cada ámbito ..." Ámbito 0: 'Obtener variable MyVar -Scope 0 -ValueOnly' Alcance 1: 'Obtener variable MyVar -Scope 1 -ValueOnly' Alcance 2: 'Obtener variable MyVar -Scope 2 -ValueOnly "}" Obteniendo el valor actual de $ MyVar. ' "MyVar dice $ MyVar" "Cambiando $ MyVar por script". $ MyVar = '¡Me puse un guión!' "MyVar dice $ MyVar" FunctionScope 'Comprobando $ MyVar desde el alcance del script antes de salir.' "MyVar dice $ MyVar" "

Al igual que antes, podemos ver aquí cómo los comandos en un ámbito pueden modificar objetos en su ámbito principal.

Información adicional

Todavía se puede hacer mucho más con alcances que Los ámbitos afectan más que solo las variables, y aún queda mucho por aprender sobre los ámbitos privados y las variables de AllScope. Para obtener más información útil, puede ejecutar el siguiente comando desde PowerShell:

Get-Help about_scopes

El mismo archivo de ayuda también está disponible en TechNet.


Crédito de imagen de alcance: spadassin en openclipart


¿Cuál es la diferencia entre Jailbreaking, Rooting y Unlocking?

¿Cuál es la diferencia entre Jailbreaking, Rooting y Unlocking?

En comparación con una PC, los teléfonos y las tabletas son dispositivos bastante bloqueados. Jailbreak, enraizamiento y desbloqueo son todas maneras de pasar sus limitaciones y hacer cosas que los fabricantes y transportistas no quieren que hagas. Algunos países tienen leyes que te impiden hacer estas cosas con los dispositivos que pagaste y legalmente, no vamos a entrar en esas leyes aquí.

(how-to)

Cómo obtener una notificación de la barra de tareas cuando Bloq Mayús o Bloq Num están habilitados

Cómo obtener una notificación de la barra de tareas cuando Bloq Mayús o Bloq Num están habilitados

Todos nosotros, en un momento dado, hemos pulsado accidentalmente la tecla Bloq Mayús o la tecla Bloq Num. Luego, escribe una contraseña y se pregunta por qué no funciona. ¿No sería bueno saber de un vistazo el estado de las teclas Bloq Mayús y Bloq Num? RELACIONADO: Cómo hacer que Windows reproduzca un sonido cuando presiona Bloq Mayús, Bloq Num o Bloq Despl Puede hacer que Windows reproduzca un sonido cuando presiona la tecla Bloq Mayús o la tecla Bloq Num.

(how-to)