2010-12-01 22 views

Respuesta

6

La sintaxis $script:Foo se usa más comúnmente para modificar una variable de nivel de secuencia de comandos, en este caso $Foo. Cuando se usa para leer la variable, generalmente es suficiente $Foo. Por ejemplo en lugar de escribir esto:

verbose-script.ps1 
$script:foo = '' 
function f { $script:foo } 

que iba a escribir esto (menos detallado y funcionalmente equivalente):

script.ps1 
$foo = '' 
function f { $foo } 

Dónde $script:Foo que es crucial es cuando se desea modificar una variable de nivel de secuencia de comandos desde dentro otro ámbito, como una función o un ScriptBlock por ejemplo, Anónimo:

PS> $f = 'hi' 
PS> & { $f; $f = 'bye';$f } 
hi 
bye 
PS> $f 
hi 

en cuenta que $f fuera del ScriptBlock no cambió correo aunque lo modificamos a bye dentro del scriptblock. Lo que sucedió es que solo modificamos una copia local de $f. Cuando no aplica un modificador como script: (o global:), PowerShell realizará un copy-on-write en la variable de nivel superior en una variable local con el mismo nombre.

Teniendo en cuenta el ejemplo anterior, si es que realmente queríamos hacer un cambio permanente en $f, tendríamos entonces utilizar un modificador como script: o global: ej .:

PS> $f = 'hi' 
PS> & { $f; $global:f = 'bye';$f } 
hi 
bye 
PS> $f 
bye 
5

El prefijo script: hace que el nombre en el lado derecho de ser consultado en el ámbito de script. Esencialmente datos que son locales al script en sí. Otros ámbitos válidos incluyen global, local y privado.

La sección de ayuda para el alcance contiene un poco de detalle sobre este tema.

help about_Scopes 
+0

apuesto a que te referías privado. :-) –

+0

entonces, ¿qué sucede cuando dot-source un script con script: prefijos en funciones y variables? –

+0

Cuando puntea la fuente, los elementos de la secuencia de comandos se arrastran hacia la secuencia de comandos que está realizando el origen de puntos. –

Cuestiones relacionadas