Compartir a través de


about_Scopes

Descripción breve

Explica el concepto de ámbito en PowerShell y muestra cómo establecer y cambiar el ámbito de los elementos.

Descripción larga

PowerShell protege el acceso a variables, alias, funciones y unidades de PowerShell (PSDrive) limitando dónde se pueden leer y cambiar. PowerShell usa reglas de ámbito para asegurarse de que no realice cambios accidentales en los elementos de otros ámbitos.

Reglas de ámbito

Al iniciar PowerShell, el host (pwsh.exe) crea un espacio de ejecución de PowerShell. Los procesos de host pueden tener varios espacios de ejecución. Cada espacio de ejecución tiene su propio estado de sesión y contenedores de ámbito. No se puede acceder al estado y los ámbitos de sesión en instancias de espacio de ejecución.

A continuación se muestran las reglas básicas del ámbito:

  • Los ámbitos pueden anidar. Un ámbito externo se conoce como ámbito primario. Los ámbitos anidados son ámbitos secundarios de ese elemento primario.
  • Un elemento está visible en el ámbito que se creó y en cualquier ámbito secundario, a menos que lo convierta explícitamente en privado.
  • Puede declarar variables, alias, funciones y unidades de PowerShell para un ámbito fuera del ámbito actual.
  • Un elemento que creó dentro de un ámbito solo se puede cambiar en el ámbito en el que se creó, a menos que especifique explícitamente un ámbito diferente.
  • Cuando el código que se ejecuta en un espacio de ejecución hace referencia a un elemento, PowerShell busca en la jerarquía de ámbito, empezando por el ámbito actual y pasando por cada ámbito primario.
    • Si no se encuentra el elemento, se crea un nuevo elemento en el ámbito actual.
    • Si encuentra una coincidencia, el valor del elemento se recupera del ámbito donde se encontró.
    • Si cambia el valor, el elemento se copia en el ámbito actual para que el cambio solo afecte al ámbito actual.
  • Si crea explícitamente un elemento que comparte su nombre con un elemento en un ámbito diferente, el elemento original podría estar oculto por el nuevo elemento, pero no se invalida ni cambia.

Ámbitos primarios y secundarios

Puede crear un nuevo ámbito secundario llamando a un script o una función. El ámbito de llamada es el ámbito primario. El script o función denominado es el ámbito secundario. Las funciones o scripts que llama pueden llamar a otras funciones, creando una jerarquía de ámbitos secundarios cuyo ámbito raíz es el ámbito global.

Nota:

Las funciones de un módulo no se ejecutan en un ámbito secundario del ámbito de llamada. Los módulos tienen su propio estado de sesión que está vinculado al ámbito en el que se importó el módulo. Todo el código de módulo se ejecuta en una jerarquía específica del módulo de ámbitos que tiene su propio ámbito raíz. Para obtener más información, consulte la sección Módulos de este artículo.

Cuando se crea un ámbito secundario, incluye todos los alias y variables que tienen la opción AllScope y algunas variables automáticas. Esta opción se describe más adelante en este artículo.

A menos que los elementos sean privados explícitamente, los elementos del ámbito primario están disponibles para el ámbito secundario. Los elementos que cree o cambie en un ámbito secundario no afectan al ámbito primario, a menos que especifique explícitamente el ámbito al crear los elementos.

Para buscar los elementos en un ámbito determinado, use 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

Cuando se hace una referencia a una variable, alias o función, PowerShell busca en el ámbito actual. Si no se encuentra el elemento, se busca en el ámbito primario. Esta búsqueda se repite hasta el ámbito global. Si una variable es privada en un ámbito primario, la búsqueda continúa a través de la cadena de ámbito. En el ejemplo 4 se muestra el efecto de una variable privada en una búsqueda de ámbito.

Nombres de ámbitos de PowerShell

PowerShell define nombres para algunos ámbitos para permitir un acceso más sencillo a ese ámbito. PowerShell define los siguientes ámbitos con nombre:

  • Global: ámbito que está en vigor cuando PowerShell se inicia o cuando se crea una nueva sesión o un espacio de ejecución. Las variables y funciones presentes cuando se inicia PowerShell, como las variables automáticas y las variables de preferencia, se crean en el ámbito global. Las variables, alias y funciones de los perfiles de PowerShell también se crean en el ámbito global. El ámbito global es el ámbito primario raíz en un espacio de ejecución.
  • Local: ámbito actual. El ámbito local puede ser el ámbito global o cualquier otro ámbito.
  • Script: ámbito que se crea mientras se ejecuta un archivo de script. Los comandos del script se ejecutan en el ámbito del script. Para los comandos de un script, el ámbito del script es el ámbito local.

En el caso de los cmdlets que admiten ámbitos, se puede hacer referencia a los ámbitos mediante un número que describe la posición relativa de un ámbito a otro. El ámbito 0 denota el ámbito actual (local), el ámbito 1 es el primario del ámbito actual, el ámbito 2 es el abuelo del ámbito actual. Este patrón continúa hasta llegar al ámbito raíz.

Modificadores de ámbito

Una variable, alias o nombre de función puede incluir cualquiera de los siguientes modificadores de ámbito opcionales:

  • global: : especifica que el nombre existe en el ámbito global .

  • local: : especifica que el nombre existe en el ámbito Local . El ámbito actual siempre es el ámbito local .

  • private: : especifica que el nombre es Privado y solo es visible para el ámbito actual.

    Nota:

    private: no es un ámbito. Es una opción que cambia la accesibilidad de un elemento fuera del ámbito en el que se define.

  • script: : especifica que el nombre existe en el ámbito de script . El ámbito del script es el ámbito del archivo de script antecesor más cercano o Global si no hay ningún archivo de script antecesor más cercano.

  • using: - Se usa para acceder a variables definidas en otro ámbito mientras se ejecuta en sesiones remotas, trabajos en segundo plano o trabajos de subprocesos.

  • workflow: : especifica que el nombre existe dentro de un flujo de trabajo. Nota: Los flujos de trabajo no se admiten en PowerShell v6 ni en versiones posteriores.

  • <variable-namespace>: un modificador creado por un proveedor de PSDrive de PowerShell. Por ejemplo:

    Espacio de nombres Descripción
    Alias: Alias definidos en el ámbito actual
    Env: Variables de entorno definidas en el ámbito actual
    Function: Funciones definidas en el ámbito actual
    Variable: Variables definidas en el ámbito actual

El ámbito predeterminado de los scripts es el ámbito de script. El ámbito predeterminado de las funciones y alias es el ámbito local, incluso si se definen en un script.

Uso de modificadores de ámbito

Para especificar el ámbito de una nueva variable, alias o función, use un modificador de ámbito.

La sintaxis de un modificador de ámbito en una variable es:

$[<scope-modifier>:]<name> = <value>

La sintaxis de un modificador de ámbito en una función es:

function [<scope-modifier>:]<name> {<function-body>}

El comando siguiente, que no usa un modificador de ámbito, crea una variable en el ámbito actual o local :

$a = "one"

Para crear la misma variable en el ámbito global , use el modificador de ámbito global: :

$global:a = "one"
Get-Variable a | Format-List *

Observe los valores de propiedad Visibility y Options .

Name        : a
Description :
Value       : one
Visibility  : Public
Module      :
ModuleName  :
Options     : None
Attributes  : {}

Compárelo con una variable privada:

$private:pVar = 'Private variable'
Get-Variable pVar | Format-List *

El uso del private modificador de ámbito establece la propiedad Options en Private.

Name        : pVar
Description :
Value       : Private variable
Visibility  : Public
Module      :
ModuleName  :
Options     : Private
Attributes  : {}

Para crear la misma variable en el ámbito del script , use el script: modificador scope:

$script:a = "one"

También puede usar un modificador de ámbito con funciones. La siguiente definición de función crea una función en el ámbito global :

function global:Hello {
  Write-Host "Hello, World"
}

También puede usar modificadores de ámbito para hacer referencia a una variable en un ámbito diferente. El comando siguiente hace referencia a la $test variable, primero en el ámbito local y, a continuación, en el ámbito global:

$test
$global:test

Modificador using: de ámbito

Using es un modificador de ámbito especial que identifica una variable local en un comando remoto. Sin un modificador, PowerShell espera que las variables de los comandos remotos se definan en la sesión remota.

El using modificador de ámbito se introduce en PowerShell 3.0.

Para cualquier script o comando que se ejecute fuera de la sesión, necesita el using modificador de ámbito para insertar valores de variable desde el ámbito de la sesión de llamada, para que el código fuera de la sesión pueda acceder a ellos. El using modificador de ámbito se admite en los siguientes contextos:

  • Comandos ejecutados de forma remota, que se inician con Invoke-Command el uso de los parámetros ComputerName, HostName, SSHConnection o Session (sesión remota)
  • Trabajos en segundo plano, iniciados con Start-Job (sesión fuera del proceso)
  • Trabajos de subproceso, iniciados a través Start-ThreadJob de o ForEach-Object -Parallel (sesión de subproceso independiente)

Dependiendo del contexto, los valores de las variables incrustadas son copias independientes de los datos en el ámbito del autor de la llamada o las referencias a ellos. En las sesiones remotas y fuera de proceso, siempre son copias independientes.

Para obtener más información, consulte about_Remote_Variables.

Una $using: referencia solo se expande al valor de una variable. Si desea cambiar el valor de una variable en el ámbito del autor de la llamada, debe tener una referencia a la propia variable. Puede crear una referencia a una variable obteniendo la instancia PSVariable de la variable. En el ejemplo siguiente se muestra cómo crear una referencia y realizar cambios en un trabajo de subproceso.

$Count = 1
$refOfCount = Get-Variable Count

Start-ThreadJob {
    ($using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob

$Count
2

Nota:

No es una operación segura para subprocesos. Puede causar daños en los datos si intenta cambiar el valor de varios subprocesos al mismo tiempo. Debe usar tipos de datos seguros para subprocesos o primitivos de sincronización para proteger los datos compartidos. Para obtener más información, consulte Recopilaciones seguras para subprocesos.

Serialización de valores de variable

Los comandos ejecutados de forma remota y los trabajos en segundo plano se ejecutan fuera de proceso. Las sesiones fuera de proceso usan la serialización y deserialización basada en XML para que los valores de las variables estén disponibles en los límites del proceso. El proceso de serialización convierte objetos en un PSObject que contiene las propiedades de los objetos originales, pero no sus métodos.

Para un conjunto limitado de tipos, la deserialización vuelve a hidratar los objetos al tipo original. El objeto rehidratado es una copia de la instancia de objeto original. Tiene las propiedades y métodos de tipo. Para tipos simples, como System.Version, la copia es exacta. En el caso de tipos complejos, la copia es imperfecta. Por ejemplo, los objetos de certificado rehidratados no incluyen la clave privada.

Las instancias de todos los demás tipos son instancias de PSObject . La propiedad PSTypeNames contiene el nombre de tipo original con deserializado, por ejemplo, Deserialized.System.Data.DataTable

Opción AllScope

Las variables y alias tienen una propiedad Option que puede tomar un valor de AllScope. Los elementos que tienen la propiedad AllScope se convierten en parte de los ámbitos secundarios que cree, aunque no son heredados retroactivamente por ámbitos primarios.

Un elemento que tiene la propiedad AllScope está visible en el ámbito secundario y forma parte de ese ámbito. Los cambios en el elemento de cualquier ámbito afectan a todos los ámbitos en los que se define la variable.

Administración del ámbito

Varios cmdlets tienen un parámetro Scope que permite obtener o establecer (crear y cambiar) elementos en un ámbito determinado. Use el siguiente comando para buscar todos los cmdlets de la sesión que tienen un parámetro Scope :

Get-Help * -Parameter scope

Para buscar las variables visibles en un ámbito determinado, use el Scope parámetro de Get-Variable. Las variables visibles incluyen variables globales, variables en el ámbito primario y variables en el ámbito actual.

Por ejemplo, el siguiente comando obtiene las variables visibles en el ámbito local:

Get-Variable -Scope local

Para crear una variable en un ámbito determinado, use 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 "One"

También puede usar el parámetro Scope de los New-Aliascmdlets , Set-Aliaso 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 en un ámbito determinado, use el Get-Item cmdlet cuando esté en el ámbito. El Get-Item cmdlet no tiene un parámetro Scope .

Nota:

Para los cmdlets que usan el parámetro Scope , también puede hacer referencia a ámbitos por número. El número describe la posición relativa de un ámbito a otro. El ámbito 0 representa el ámbito actual o local. El ámbito 1 indica el ámbito primario inmediato. El ámbito 2 indica el elemento primario del ámbito primario, etc. Los ámbitos numerados son útiles si ha creado muchos ámbitos recursivos.

Uso de la notación de origen de puntos con ámbito

Los scripts y las funciones siguen las reglas de ámbito. Los crea en un ámbito determinado y solo afectan a ese ámbito, a menos que use un parámetro de cmdlet o un modificador de ámbito para cambiar ese ámbito.

Sin embargo, puede agregar el contenido de un script o función al ámbito actual mediante la notación dot-source. Al ejecutar un script o una función mediante la notación dot-source, se ejecuta en el ámbito actual. Las funciones, alias y variables del script o la función se agregan al ámbito actual.

Por ejemplo, para ejecutar el Sample.ps1 script desde el C:\Scripts directorio en el ámbito de script (el valor predeterminado para scripts), solo tiene que escribir la ruta de acceso completa al archivo de script en la línea de comandos.

c:\scripts\sample.ps1

Un archivo de script debe tener una .ps1 extensión de archivo para que sea ejecutable. Los archivos que tienen espacios en su ruta de acceso deben incluirse entre comillas. Si intenta ejecutar la ruta de acceso entre comillas, PowerShell muestra el contenido de la cadena entrecomillada en lugar de ejecutar el script. El operador de llamada (&) permite ejecutar el contenido de la cadena que contiene el nombre de archivo.

El uso del operador de llamada para ejecutar una función o un script lo ejecuta en el ámbito del script. El uso del operador de llamada no es diferente de ejecutar el script por nombre.

& c:\scripts\sample.ps1

Puede obtener más información sobre el operador de llamada en about_Operators.

Para ejecutar el Sample.ps1 script en el ámbito local, escriba un punto y un espacio (. ) antes de la ruta de acceso al script:

. c:\scripts\sample.ps1

Ahora, las funciones, alias o variables definidas en el script se agregan al ámbito actual.

Restricción sin ámbito

PowerShell tiene algunas opciones y características que son similares al ámbito y pueden interactuar con ámbitos. Esta característica puede confundirse con el ámbito o el comportamiento del ámbito.

Las sesiones, los módulos y las solicitudes anidadas son entornos independientes, no ámbitos secundarios del ámbito global de la sesión.

Sesiones

Una sesión es un entorno en el que se ejecuta PowerShell. Al crear una sesión en un equipo remoto, PowerShell establece una conexión persistente al equipo remoto. La conexión persistente le permite usar la sesión para varios comandos relacionados.

Dado que una sesión es un entorno independiente, tiene su propio ámbito, pero una sesión no es un ámbito secundario de la sesión en la que se creó. La sesión comienza con su propio ámbito global. Este ámbito es independiente del ámbito global de la sesión. Puede crear ámbitos secundarios en la sesión. Por ejemplo, puede ejecutar un script para crear un ámbito secundario en una sesión.

Módulos

Puede usar un módulo de PowerShell para compartir y entregar herramientas de PowerShell. Un módulo es una unidad que puede contener cmdlets, scripts, funciones, variables, alias y otros elementos útiles. A menos que se exporte explícitamente (mediante Export-ModuleMember o el manifiesto del módulo), los elementos de un módulo no son accesibles fuera del módulo. Por lo tanto, puede agregar el módulo a la sesión y usar los elementos públicos sin preocuparse de que los demás elementos podrían invalidar los cmdlets, scripts, funciones y otros elementos de la sesión.

De forma predeterminada, los módulos se cargan en el ámbito de nivel raíz (global) del espacio de ejecución. La importación de un módulo no cambia el ámbito. Dentro de la sesión, los módulos tienen su propio ámbito. Considere el siguiente módulo C:\temp\mod1.psm1:

$a = "Hello"

function foo {
    "`$a = $a"
    "`$global:a = $global:a"
}

Ahora creamos una variable $aglobal , asígnele un valor y llame a la función foo.

$a = "Goodbye"
foo

El módulo declara la variable $a en el ámbito del módulo y, a continuación, la función foo genera el valor de la variable en ambos ámbitos.

$a = Hello
$global:a = Goodbye

Los módulos crean contenedores de ámbito paralelo vinculados al ámbito en el que se importaron. Los elementos exportados por el módulo están disponibles a partir del nivel de ámbito en el que se importan. Los elementos no exportados desde el módulo solo están disponibles en el contenedor de ámbito del módulo. Las funciones del módulo pueden tener acceso a elementos del ámbito en el que se importaron, así como elementos del contenedor de ámbito del módulo.

Si carga Module2 desde Module1, Module2 se carga en el contenedor de ámbito de Module1. Las exportaciones de Module2 se colocan en el ámbito del módulo actual de Module1. Si usa Import-Module -Scope local, las exportaciones se colocan en el objeto de ámbito actual en lugar de en el nivel superior. Si está en un módulo y carga otro módulo mediante Import-Module -Scope global (o Import-Module -Global), ese módulo y sus exportaciones se cargan en el ámbito global en lugar del ámbito local del módulo. La característica WindowsCompatibility hace esto para importar módulos proxy en el estado de sesión global.

Avisos anidados

Los avisos anidados no tienen su propio ámbito. Cuando se escribe un símbolo del sistema anidado, el aviso anidado es un subconjunto del entorno. Sin embargo, permanece dentro del ámbito local.

Los scripts tienen su propio ámbito. Si está depurando un script y llega a un punto de interrupción en el script, escriba el ámbito del script.

Opción privada

Los alias y las variables tienen una propiedad Option que puede tomar un valor de Private. Los elementos que tienen la Private opción se pueden ver y cambiar en el ámbito en el que se crean, pero no se pueden ver ni cambiar fuera de ese ámbito.

Por ejemplo, si crea una variable que tiene una opción privada en el ámbito global y, a continuación, ejecuta un script, Get-Variable los comandos del script no muestran la variable privada. El uso del modificador de ámbito global en esta instancia no muestra la variable privada.

Puede usar el parámetro Option de los New-Variablecmdlets , Set-Variable, New-Aliasy Set-Alias para establecer el valor de la propiedad Option en Private.

Visibilidad

La propiedad Visibility de una variable o alias determina si puede ver el elemento fuera del contenedor, en el que se creó. Un contenedor podría ser un módulo, un script o un complemento. La visibilidad está diseñada para contenedores de la misma manera que el Private valor de la propiedad Option está diseñado para ámbitos.

La propiedad Visibility toma los Public valores y Private . Los elementos que tienen visibilidad privada solo se pueden ver y cambiar en el contenedor en el que se crearon. Si se agrega o importa el contenedor, los elementos que tienen visibilidad privada no se pueden ver ni cambiar.

Dado que la visibilidad está diseñada para contenedores, funciona de forma diferente en un ámbito.

  • Si crea un elemento que tiene visibilidad privada en el ámbito global, no podrá ver ni cambiar el elemento en ningún ámbito.
  • Si intenta ver o cambiar el valor de una variable que tiene visibilidad privada, PowerShell devuelve un mensaje de error.

Puede usar los New-Variable cmdlets y Set-Variable para crear una variable que tenga visibilidad privada.

Ejemplos

Ejemplo 1: Cambiar un valor de variable solo en un script

El comando siguiente cambia el valor de la $ConfirmPreference variable en un script. El cambio no afecta al ámbito global.

En primer lugar, para mostrar el valor de la $ConfirmPreference variable en el ámbito local, use el siguiente comando:

PS>  $ConfirmPreference
High

Cree un script Scope.ps1 que contenga los siguientes comandos:

$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."

Ejecute el script. El script cambia el valor de la $ConfirmPreference variable y, a continuación, informa de su valor en el ámbito del script. La salida debe ser similar a la siguiente salida:

The value of $ConfirmPreference is Low.

A continuación, pruebe el valor actual de la $ConfirmPreference variable en el ámbito actual.

PS>  $ConfirmPreference
High

En este ejemplo se muestra que los cambios en el valor de una variable en el ámbito del script no afectan al valor de la variable en el ámbito primario.

Ejemplo 2: Visualización de un valor de variable en distintos ámbitos

Puede usar modificadores de ámbito para ver el valor de una variable en el ámbito local y en un ámbito primario.

En primer lugar, defina una $test variable en el ámbito global.

$test = "Global"

A continuación, cree un Sample.ps1 script que defina la $test variable. En el script, use un modificador de ámbito para hacer referencia a las versiones globales o locales de la $test variable.

En Sample.ps1:

$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."

Al ejecutar Sample.ps1, la salida debe ser similar a la siguiente salida:

The local value of $test is Local.
The global value of $test is Global.

Una vez completado el script, solo se define el valor global de $test en la sesión.

PS> $test
Global

Ejemplo 3: Cambiar el valor de una variable en un ámbito primario

A menos que proteja un elemento mediante la opción Private u otro método, puede ver y cambiar el valor de una variable en un ámbito primario.

En primer lugar, defina una $test variable en el ámbito global.

$test = "Global"

A continuación, cree un script Sample.ps1 que defina la $test variable. En el script, use un modificador de ámbito para hacer referencia a las versiones globales o locales de la $test variable.

En Sample.ps1:

$global:test = "Local"
"The global value of `$test is $global:test."

Una vez completado el script, se cambia el valor global de $test .

PS> $test
Local

Ejemplo 4: Creación de una variable privada

Una variable se puede hacer privada mediante el private: modificador de ámbito o creando la variable con la propiedad Option establecida en Private. Las variables privadas solo se pueden ver o cambiar en el ámbito en el que se crearon.

En este ejemplo, el ScopeExample.ps1 script crea cinco funciones. La primera función llama a la siguiente función, que crea un ámbito secundario. Una de las funciones tiene una variable privada que solo se puede ver en el ámbito en el que se creó.

PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
    "Setting `$funcAVar1 to 'Value set in funcA'"
    $funcAVar1 = "Value set in funcA"
    funcB
}

function funcB {
    "In funcB before set -> '$funcAVar1'"
    $private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
    "In funcB after set  -> '$funcAVar1'"
    funcC
}

function funcC {
    "In funcC before set -> '$funcAVar1' - should be the value set in funcA"
    $funcAVar1 = "Value set in funcC - Child scopes can see this change."
    "In funcC after set  -> '$funcAVar1'"
    funcD
}

function funcD {
    "In funcD before set -> '$funcAVar1' - should be the value from funcC."
    $funcAVar1 = "Value set in funcD"
    "In funcD after set  -> '$funcAVar1'"
    '-------------------'
    ShowScopes
}

function ShowScopes {
    $funcAVar1 = "Value set in ShowScopes"
    "Scope [0] (local)  `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
    "Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
    "Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
    "Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
    "Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1

La salida muestra el valor de la variable en cada ámbito. Puede ver que la variable privada solo está visible en funcB, el ámbito en el que se creó.

Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set  -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set  -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set  -> 'Value set in funcD'
-------------------
Scope [0] (local)  $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'

Como se muestra en la salida de ShowScopes, puede acceder a variables desde otros ámbitos mediante Get-Variable y especificando un número de ámbito.

Ejemplo 5: Uso de una variable local en un comando remoto

Para las variables de un comando remoto creado en la sesión local, use el using modificador de ámbito. PowerShell supone que las variables de los comandos remotos se crearon en la sesión remota.

La sintaxis es:

$using:<VariableName>

Por ejemplo, los siguientes comandos crean una $Cred variable en la sesión local y, a continuación, usan la $Cred variable en un comando remoto:

$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $using:Cred}

El using modificador de ámbito se introdujo en PowerShell 3.0.

Consulte también