¿Cómo afectan PowerShell ?

PS-Scope_Final-001
En las secuencias de comandos por lotes, los cambios en las variables de entorno tienen un impacto global a la sesión actual de forma predeterminada. Para PowerShell, exactamente lo contrario es cierto porque ámbitos se utilizan para aislar las modificaciones de un script. Aquí, vamos a explorar cómo afectan a ámbitos scripts de PowerShell y cómo trabajar en y alrededor de ellos.

¿Qué es un Objeto?

En PowerShell, un "alcance" se refiere al entorno actual en el que una secuencia de comandos o shell de comandos está operando. Scopes se utilizan para proteger ciertos objetos dentro del entorno sea involuntariamente modificados por scripts o funciones. En particular, las siguientes cosas están protegidos frente a posibles modificaciones por ejecutar comandos desde otro ámbito, a menos que se especifique lo contrario por los parámetros en los comandos:
  • Variables
  • Alias
  • Funciones
  • Unidades PowerShell (PSDrives)
Nuevos ámbitos se crean cada vez que se ejecuta un script o función, o cuando se crea una nueva sesión o instancia de PowerShell. Scopes creados mediante la ejecución de secuencias de comandos y funciones tienen un "padre / hijo" relación con el alcance de la que fueron creados.Hay unos pocos alcances que tienen significados especiales en particular, y se puede acceder por nombre:
  • El Global ámbito es el alcance que se crea cuando se inicia PowerShell. Incluye las variables, alias, funciones y PSDrives que están integrados a PowerShell así como cualquier que son hechos por su perfil de PowerShell.
  • El local alcance se refiere a lo que el alcance actual es. Al iniciar PowerShell se refieren al ámbito global, dentro de un script que será el alcance de secuencias de comandos, etc.
  • El script se crea alcance cuando se ejecuta un script. Los únicos comandos que operan dentro de este ámbito son los que están en el guión.
  • Privados ámbitos se pueden definir dentro del ámbito actual, para evitar comandos en otros ámbitos de poder leer o modificar elementos que de otro modo podrían tener acceso.
Alcances también puede hacer referencia a número en ciertos comandos, en el ámbito actual se conoce como cero y sus antepasados ​​se hace referencia al aumentar enteros. Por ejemplo, dentro de un script de gestión del ámbito global, el alcance de secuencias de comandos sería 0 y el alcance global sería 1. Un ámbito que se anida más en el ámbito de secuencias de comandos, como una función, se referiría al ámbito global como 2 . Los números negativos no trabajarán para hacer referencia a los ámbitos de los niños, aunque - la razón de esto será evidente en breve.

¿Cómo afectan Scopes Comandos

Como se mencionó anteriormente, los comandos ejecutados dentro de un ámbito de aplicación no afectarán a las cosas en otro ámbito a menos que específicamente que lo haga. Por ejemplo, si $ MiVar existe en el ámbito global y una secuencia de comandos se ejecuta un comando para configurar $ MiVar a un valor diferente, la versión global de $ MiVar permanecerá inalterada mientras que una copia de $ MiVar se coloca en el ámbito de aplicación de secuencias de comandos con el nuevo valor. Si un $ MiVar no existe, un guión lo creará en el ámbito de secuencias de comandos por defecto - no en el ámbito global. Esto es importante de recordar a medida que aprende acerca de la relación real de padre / hijo entre ámbitos.
La relación padre / hijo de ámbitos en PowerShell es de un solo sentido. Los comandos pueden ver en, y opcionalmente modificar el ámbito actual, su matriz, y cualquier alcances encima. Sin embargo, ellos no pueden ver o modificar las cosas en los hijos del ámbito actual. Esto es principalmente porque, una vez que usted se ha movido en un ámbito padre, el alcance del niño ya ha sido destruida porque ha cumplido su propósito. Por ejemplo, ¿por qué tienen que ver o modificar una variable en el ámbito de secuencias de comandos, desde el ámbito global, después de que el guión ha terminado? Hay un montón de casos en los que usted necesita de un guión o cambios de función para persisten más allá de su terminación, pero no tantos, donde había necesidad de realizar cambios en los objetos dentro antes o después de que se ejecute el ámbito de la función de secuencia de comandos o. (Por lo general, este tipo de cosas van a ser manejados como parte de la secuencia de comandos o la función propia de todos modos.)
Por supuesto, ¿cuáles son las reglas sin excepciones? Una excepción a lo anterior son ámbitos privados. Los objetos en los ámbitos privados sólo son accesibles a los comandos se ejecutan en el ámbito de aplicación de la que fueron creados. Otra excepción importante es los artículos que tienen la propiedad AllScope. Estas son variables especiales y alias para el que un cambio en cualquier ámbito afectará a todos los ámbitos. Los siguientes comandos le mostrará cuáles son las variables y los 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 empezar en una sesión de PowerShell donde el $ MiVar variable se ha establecido en una cadena, 'Soy una variable global!', Desde la línea de comandos. Entonces, el siguiente script se ejecuta desde un archivo llamado Alcance-Demo.ps1:
Función FunctionScope
{
    'Cambio de $ MiVar con una función ".
    $ MiVar = 'yo nos set por una función!'
    "MiVar dice $ MiVar"
}
''
'Comprobación valor actual de $ MiVar.'
"MiVar dice $ MiVar"
''
'Cambio de $ MiVar por la escritura. "
$ MiVar = 'yo nos set por un guión!'
"MiVar dice $ MiVar"
''
FunctionScope
''
'Comprobación valor final de MiVar antes de la salida de la escritura. "
"MiVar dice $ MiVar"
''
Si scripts de PowerShell trabajaron los mismos que los scripts por lotes, es de esperar que el valle de $ MiVar (o% MiVar% en la sintaxis de lotes) para cambiar de 'Yo soy una variable global!', A 'me puse por un guión!' y, finalmente, 'me puse por una función!' donde permanecería hasta que se cambió de nuevo o explícitamente la sesión se termina. Sin embargo, ver que es lo que realmente sucede aquí como nos movemos a través de cada uno de los ámbitos - en particular, después de la función FunctionScope ha completado su trabajo y que compruebe la variable de nuevo desde el guión, y más tarde el Mundial, el alcance.
imagen
Como se puede ver la variable pareció cambiar a medida que avanzábamos a través de la escritura, ya que, hasta que se completó la función FunctionScope, hicimos el registro de la variable dentro del mismo alcance que fue modificado ultimamente. Después FunctionScope se hizo, sin embargo, nos mudamos de nuevo en el ámbito de aplicación de secuencias de comandos donde $ MiVar se quedó al margen de la función. Entonces, cuando el guión terminado, volvimos a cabo en el ámbito mundial en el que no se ha modificado en absoluto.

Alcanzar Fuera del Alcance Local

Por lo tanto, esto es todo muy bien para ayudar a mantener la aplicación accidentalmente cambios en el medio ambiente más allá de las secuencias de comandos y funciones, pero lo que si usted realmente no quiere hacer estas modificaciones? Hay una especial, y bastante simple, la sintaxis para crear y modificar objetos más allá del ámbito local. Usted acaba de poner el nombre del ámbito en el inicio del nombre de la variable, y poner dos puntos entre el alcance y los nombres de variables. Como este:
$ Mundial: MiVar
$ Script: MiVar
$ Locales: MiVar
Puede utilizar estos modificadores tanto al visualizar y establecer las variables. Vamos a ver lo que pasa con este script de demostración:
Función FunctionScope
{
    ''
    'Cambio de $ MiVar en el ámbito local de la función ... "
    $ Locales: MiVar = "Este es MiVar en el ámbito local de la función."
    'Cambio de $ MiVar en el ámbito de la escritura ... "
    $ Script: MiVar = 'MiVar solía ser fijado por un guión. Ahora fijado por una función '.
    'Cambio de $ MiVar en el ámbito global ... "
    $ Mundial: MiVar MiVar = 'se creó en el ámbito global. Ahora fijado por una función '.
    ''
    'Comprobar $ MiVar en cada ámbito ...'
    "Local: $ locales: MiVar"
    "Guión: $ script: MiVar"
    "Global: $ mundial: MiVar"
    ''
}
''
"Conseguir valor actual de $ MiVar. '
"MiVar dice $ MiVar"
''
'Cambio de $ MiVar por la escritura. "
$ MiVar = 'yo nos set por un guión!'
"MiVar dice $ MiVar"

FunctionScope

'Comprobar $ MiVar de alcance guión antes de salida. "
"MiVar dice $ MiVar"
''
Al igual que antes, empezaremos estableciendo la variable en el ámbito global y terminamos con la comprobación de que el resultado final alcance global.
imagen
Aquí se puede ver que FunctionScope fue capaz de cambiar la variable en el ámbito de aplicación de secuencias de comandos, y tienen los cambios persisten después de que se terminó. Además, el cambio en la variable en el ámbito mundial se mantuvo incluso después de que el guión había salido. Esto puede ser particularmente útil para si tiene que cambiar varias veces las variables dentro de una secuencia de comandos o en el ámbito global, utilizando el mismo código - que acaba de definir una función o un script que está escrito para modificar la variable de dónde y cómo se necesita que se haga, y llamamiento a que cada vez son necesarios esos cambios.
Como se mencionó anteriormente, los números ámbito de aplicación también se pueden utilizar en ciertos comandos para modificar la variable a diferentes niveles en relación con el ámbito local. Aquí está el mismo guión utilizado en el segundo ejemplo anterior, pero con la función modificada para utilizar la variable Get y Set-Variable comandos con los números de ámbito lugar de hacer referencia directamente a la variable con ámbitos con nombre:
Función FunctionScope
{
    ''
    'Cambio de $ MiVar alcance 0, en relación con FunctionScope ...'
    MiVar Set-Variable "Este es MiVar alcance de la función 0." -scope 0
    'Cambio de $ MiVar alcance 1, en relación con FunctionScope ...'
    Set-Variable MiVar 'MiVar fue cambiado en su alcance 1, a partir de una función. " -scope 1
    'Cambio de $ MiVar alcance 2, en relación con Functionscope ...'
    Set-Variable MiVar 'MiVar fue cambiado en su alcance 2, a partir de una función. " -scope 2
    ''
    'Comprobar $ MiVar en cada ámbito ...'
    «Ámbito de aplicación 0: '
    Get-Variable MiVar -Ámbito 0 -ValueOnly
    «Ámbito de aplicación 1: '
    Get-Variable MiVar -Ámbito 1 -ValueOnly
    «Ámbito de aplicación 2: '
    Get-Variable MiVar -Ámbito 2 -ValueOnly
    ''
}
''
"Conseguir valor actual de $ MiVar. '
"MiVar dice $ MiVar"
''
'Cambio de $ MiVar por la escritura. "
$ MiVar = 'yo nos set por un guión!'
"MiVar dice $ MiVar"

FunctionScope

'Comprobar $ MiVar de alcance guión antes de salida. "
"MiVar dice $ MiVar"
''
imagen
Al igual que antes, podemos ver aquí cómo comandos en un ámbito puede modificar objetos en su ámbito de aplicación los padres.

Información Adicional

Todavía hay mucho más que se puede hacer con ámbitos que caben en este artículo. Scopes afectan más que las variables, y hay todavía más que aprender acerca de los ámbitos privados y las variables AllScope. Para obtener información más útil, puede ejecutar el siguiente comando desde dentro PowerShell:
Get-Help about_Scopes
El mismo archivo de ayuda también está disponible en TechNet .

Alcance imagen de crédito: spadassin en openclipart