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.
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:
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:
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.
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')
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.
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.
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
Cómo configurar y usar Cortana en Windows 10
Si ha estado usando Windows 10 y no ha empezado a usar Cortana, puede estar interesado en probarlo. Básicamente es la versión de Microsoft de Siri y Google Assistant, pero está integrada directamente en Windows.Puede hacerle preguntas a Cortana y puede ayudarle a hacer cosas en su PC. Con cada actualización, Microsoft agrega nuevas características y opciones a Cortana, por lo que es algo útil. Desd
Cómo grabar jugabilidad en su teléfono, iPhone o iPad Android
Windows 10, PlayStation 4 y Xbox One tienen formas integradas de grabar su juego y publicar clips en línea. Ahora, los dispositivos Android, iPhones y iPads están ganando formas integradas de capturar videos de juegos móviles y publicarlos en YouTube o en otro lugar. Estas soluciones también te permiten capturar tu voz con tu micrófono y, en el caso de Android, captura tu rostro con la cámara frontal.